不过为了方便,我没有使用beautifulsoup和pdfkit,而是直接通过python自带的HTMLParser来处理html,然后解析出html中的主体内容,然后重新生成一个新的html,并重命名为章节内容。
首先我们看一下廖雪峰python的网页结构
分为:目录、正文、其他。对于我们有用的信息都在目录和正文中,而且目录我们只需要解析一次,因为各个页面中的目录都是一样的。
所以我们的解析思路是这样的:
1. 从第一页中解析目录,提取目录各项名称和对应的url地址,分别保存到两个列表中,即titleList和addrList
2. 创建一个以titleList中各项为文件名的html文件并打开,将文件名写入文件开头作为标题,
3. 依次次访问addrlist中对应的各个网页,提取网页中的正文部分,并将正文部分内容写入到之前打开的文件中,同时规划好各个部分的格式。
从首页中获取目录信息
def get_url_list():
"""
获取所有URL目录列表
:return:
"""
response = urllib.request.urlopen("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000")
htmlcontext=response.read().decode("UTF-8")
myHp=hp()
myHp.feed(htmlcontext)
myHp.close()
首先通过urllib.response的函数来获取网页内容,然后我们创建一个hp对象来处理读取的html文档内容。
对于hp类是继承自HTMLParser类的,同时需要重载HTMLParser的三个函数handle_starttag、handle_endtag和handle_data
当检测到节点头时,就会触发handle_starttag的调用,例如<div>
当检测到节点尾时,就会触发handle_endtag的调用,例如</div>
当检测到其他内容是会调用handle_data,这个通常来处理节点头和节点尾之间的文本节点,例如<div>ABC</div>
中的ABC
另外节点头中通常包含有属性值,这些值通常在调用handle_starttag是通过attr这样的一个元组序列来保存传递的。
于是,当我们需要判断某一个节点头中是否包含我们需要的属性值是,我们就需要遍历这个attr,比如有这样一个代码:
<div class="start">
python教程
</div>
判断该段代码头是否class=”start”
for each in attr:
if class == each[0] and "start"== each[1]:
return True
return False