前言
以前我一直使用Beautiful Soup,又或者一些框架里的Xpath来解析HTML,今天在偶然间接触到 lxml,被他的事件驱动解析吸引,有种相见恨晚的感觉,用起来非常的爽。
HTML解析库有很多,比如HTMLParser也是事件驱动,但是它的文档容错能力弱,html5lib解析起来速度慢,lxml速度还行,容错能力也强。
Event-driven paring
lxml.etree有两种事件驱动的解析起接口,一个在构建树(iterparse)时生成解析器事件,另一个不根据树构建树,而是用SAX-like风格调用一个目标对象的回调方法。SAX是Simple API for XML?
使用目标解析器方法
目标解析器是可以实现以下方法的类:
- start 访问标签的起始部分时触发,如打开;
- end 访问标签的闭合部分时触发,如
- data 触发文本子节点并访问该文本
- close 在解析完成后触发
举例
class HtmlParser():
def __init__(self, response):
self._parse(response)
print(response.content)
def start(self, tag, attrs):
print("start-----------------------")
print(tag)
def end(self, tag):
print("end-------------------------")
print(tag)
def close(self):
print("called close")
def _parse(self, response):
parser = etree.HTMLParser(target=self, recover=True)
try:
etree.fromstring(response.content, parser)
except ValueError:
pass
import requests
web = requests.get("https://www.baidu.com")
a = HtmlParser(web)
pass
上面这个类,实例化时会根据网页中的标签依次触发,你可以在触发的函数里面写好处理,比如表单的填充。用起来非常爽