制作cpprefernce.chm
2016-03-17 21:47
381 查看
在关于C++的参考网站里,我觉得最好的就是cppreference了,然后某天某月的某一天,突然闪现一个想法,要把它作成chm。于是艰难地开始了。
标准C++并没有处理网页的功能,所以要么找库,要么换语言。根据我偶像书里的一句话,C++加python可以解决99.99%的问题,于是我把目光看向了python。不得不说刚开始学的时候挺坑爹的,劳资第一个python程序折腾了一下午,明明看起来一点问题都没有,就是不行,最后原因竟然是因为Tab键,当时我就骂街了。
后来慢慢算是入门了,我开始下网页。一开始,我问小木,有没有什么python的爬虫工具,结果被他一顿吐槽“你这个事情主要工作就是爬虫了,你交给工具来那你不就啥都没干”。于是只好自己来。中间出过一些问题,比如中途挂了,前功尽弃,于是我加了进度保存。代码如下:
网页下载以后,还要做一些加工,比如body下header与footer下的内容都要清除,链接也要改成本地链接等等。
然后还没等我开始第二阶段工作的时候,我发现我的爬虫做的不彻底。一些形如“ operator< ”的页面,它的链接为“ operator< ”,我并没有抓到。后来又修改了正则表达式,然而这时候我发现我下载不了cppreference的网页了,也许是连续一个多星期以来,我每天都反反复复地下来下去,人家把我拉黑了吧。于是我最新写的正则表达式,效果如何,又会带来什么新问题,都不得而知了。这事就这样先放下了。
……几个月后……
我开始了第三阶段,网页不再是自己抓,而是直接下的离线版。最新的离线版是html_book_20151129,它的结构是这样的:
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322205837651-152178132.jpg)
en下面存放的是html,已经加工过了,可以直接编译成chm。common下放的是配置文件,css等。
使用的工具是easy chm,还要下载hhc.exe和hha.dll,这是微软的用来编译chm的工具;然后下载 itcc.dll 和 itircl.dll 并注册,如果没有它们,编译出来的chm会不支持搜索。把它们全都放到easyCHM.exe的同级目录下。打开程序,新建工程,目录选择/reference/en,然后在搜索选项->其他下,把“自动替换下划线为空格”取消,按确定。
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322211154495-525828291.jpg)
然后界面是这样的:
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322211632198-242786805.jpg)
刚开始问题很多:基本每条目录后面都带着“-cppreference.com”;目录下,只有图标为问号的叶节点有对应的html,图标为书本的父结点没有;极个别链接的地址不对;一些符号如<显示为<。这些问题根据个人喜好,可以改也可以不改。下面讲一个示例问题。
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322212153339-2052915295.jpg)
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322212201120-167382930.jpg)
如图所示,上面的排版问题。直接用浏览器打开是正常的,编译成chm以后就不换行了。用一个稍微高级点的浏览器查看一下,结果是这样的:
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322213034245-1486392742.jpg)
只能理解为微软的IE不支持这种风格了。去w3c查了一下(搜css display),把方式改为block即可。
我在制作的时候,绝大部分时候花在改标题改链接上了,改到想吐。最后得到一个结论:要参考直接上网站不就好了!(╯‵□′)╯︵┻━┻
标准C++并没有处理网页的功能,所以要么找库,要么换语言。根据我偶像书里的一句话,C++加python可以解决99.99%的问题,于是我把目光看向了python。不得不说刚开始学的时候挺坑爹的,劳资第一个python程序折腾了一下午,明明看起来一点问题都没有,就是不行,最后原因竟然是因为Tab键,当时我就骂街了。
后来慢慢算是入门了,我开始下网页。一开始,我问小木,有没有什么python的爬虫工具,结果被他一顿吐槽“你这个事情主要工作就是爬虫了,你交给工具来那你不就啥都没干”。于是只好自己来。中间出过一些问题,比如中途挂了,前功尽弃,于是我加了进度保存。代码如下:
import urllib.request import re,os #保存形如en.cppreference.com????/w/**的网页 index = "http://en.cppreference.com/" pattern = re.compile(r'<a href="/w/(c|cpp/.*)" title="c') inqueue = {"w"} queue = ["w"] dir = os.getcwd() offset = 50 cnt = 0 if os.path.exists("done.txt") and os.path.exists("all.txt"): done = open("done.txt","r") cnt = int(done.readline().strip()) done.close() all = open("all.txt","r") for line in all: queue.append(line.strip()) all.close() inqueue = set(queue) while len(queue) > cnt: cur = queue[cnt] if cnt > 0 and cnt % offset == 0: all = open("all.txt","w") for line in queue: all.write(line+'\n') all.close() done = open("done.txt","w") done.write(str(cnt)+'\n') done.close() print(cnt) url = index+cur print(url) req = urllib.request.Request(url) html = urllib.request.urlopen(req) data = html.read() content = data.decode() m = pattern.search(content) while m: str0 = '/w/'+m.group(1).replace(" ","_") if str0 in inqueue: m = pattern.search(content, m.end()) continue queue.append(str0) inqueue.add(str0) m = pattern.search(content, m.end()) str1 = cur.replace("/","\\") file = os.path.join(dir,str1+".html") Path = os.path.dirname(file) if os.path.exists(file): cnt = cnt+1 continue if not os.path.exists(Path): os.makedirs(Path) with open(file,"wb") as f: f.write(data) html.close() cnt = cnt+1 else: cnt = len(queue) done = open("done.txt","w") done.write(str(cnt)+'\n') done.close() print("已完成") input("按回车结束")
网页下载以后,还要做一些加工,比如body下header与footer下的内容都要清除,链接也要改成本地链接等等。
然后还没等我开始第二阶段工作的时候,我发现我的爬虫做的不彻底。一些形如“ operator< ”的页面,它的链接为“ operator< ”,我并没有抓到。后来又修改了正则表达式,然而这时候我发现我下载不了cppreference的网页了,也许是连续一个多星期以来,我每天都反反复复地下来下去,人家把我拉黑了吧。于是我最新写的正则表达式,效果如何,又会带来什么新问题,都不得而知了。这事就这样先放下了。
……几个月后……
我开始了第三阶段,网页不再是自己抓,而是直接下的离线版。最新的离线版是html_book_20151129,它的结构是这样的:
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322205837651-152178132.jpg)
en下面存放的是html,已经加工过了,可以直接编译成chm。common下放的是配置文件,css等。
使用的工具是easy chm,还要下载hhc.exe和hha.dll,这是微软的用来编译chm的工具;然后下载 itcc.dll 和 itircl.dll 并注册,如果没有它们,编译出来的chm会不支持搜索。把它们全都放到easyCHM.exe的同级目录下。打开程序,新建工程,目录选择/reference/en,然后在搜索选项->其他下,把“自动替换下划线为空格”取消,按确定。
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322211154495-525828291.jpg)
然后界面是这样的:
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322211632198-242786805.jpg)
刚开始问题很多:基本每条目录后面都带着“-cppreference.com”;目录下,只有图标为问号的叶节点有对应的html,图标为书本的父结点没有;极个别链接的地址不对;一些符号如<显示为<。这些问题根据个人喜好,可以改也可以不改。下面讲一个示例问题。
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322212153339-2052915295.jpg)
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322212201120-167382930.jpg)
如图所示,上面的排版问题。直接用浏览器打开是正常的,编译成chm以后就不换行了。用一个稍微高级点的浏览器查看一下,结果是这样的:
![](http://images2015.cnblogs.com/blog/386096/201603/386096-20160322213034245-1486392742.jpg)
只能理解为微软的IE不支持这种风格了。去w3c查了一下(搜css display),把方式改为block即可。
我在制作的时候,绝大部分时候花在改标题改链接上了,改到想吐。最后得到一个结论:要参考直接上网站不就好了!(╯‵□′)╯︵┻━┻
相关文章推荐
- 【HDU 1203】I NEED A OFFER!(01背包)
- 前端后端冷知识
- 关于JS数组对象
- js总结1
- Newtonsoft.Json
- C_Json数据解析_s
- ovirt 之node安装
- JS学习笔记(一)
- Html(仿QQ登录WEB网页编写)小小记录
- Bootstrap 弹出框
- Caffe + Ubuntu 15.04 + CUDA 7.5 新手安装配置指南
- cssAndHtml
- 让 innerHTML 进来的 script 代码跑起来
- js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
- 第八章:JavaScript事件驱动编程和访问CSS技术
- JS拖拽pro
- jsp笔记(1)
- js全屏代码
- js字符串大小写转换
- jquery 多标签添加 活动标签 促销标签