lxml支持HTML及XML,解析速度快,兼容性强。使用方式和ElementTree比较像。
安装方法
$ pip install lxml
lxml节点对象常用方法:
- xpath(): 使用XPath获取下级节点,结果为列表
- text: 节点文本
- itertext(): 迭代输出当前节点及下级所有节点文本,例如
''.join(node.itertext())
可以拿到节点中所有文本 - attrib: 节点属性字典,如a节点
node.attrib['href']
可以拿到其url
操作步骤
- 第一步:使用etree.HTML()实例化得到根节点,实例化时会自动补全HTML代码。
from lxml import etree
html = '''
<div id="content">
<ul>
<li id="top_001" class="item">肖申克的救赎<li>
<li id="top_001" class="item">霸王别姬</li>
<li id="top_002" class="item">阿甘正传</li>
</ul>
</div>
'''
root = etree.HTML(html)
- 第二步:使用root.xpath()查找节点。
不同于xml.etree.ElementTree中只支持部分的XPath语法,root.xpath()中支持使用完整的XPath语法,路径不需要使用“.”开始,root.xpath()方法返回查找到的所有节点列表,示例如下:
root.xpath('/html/body/div'):绝对路径查找
root.xpath('//ul/li[2]') :相对路径,结合索引
root.xpath('//div[@id="content"]'):结合属性查找
root.xpath('//li[@id="top_001" and @class="item"]'):多条件查找
root.xpath('//li[text()="阿甘正传"]'):使用text()函数根据元素文本查找
root.xpath('//li[contains(text(), "阿甘")]'):使用contains函数查找文本包含
root.xpath('//li[1]/following-sibling::li'):使用XPath的轴方法获取后面所有的同级元素
如果想要获取节点是属性或文本等,可以从返回的节点列表中取出节点,并使用.tag、.text或.attrib获取节点的标签、文本或属性字典,也可以直接在XPath语句中使用/@attribute或/text来获取属性,示例如下:
div = root.xpath('//div')[0]
print(div.attrib)
print(root.xpath('//div/@id'))
print(root.xpath('//ul/li[last()]/text()'))
由于root.xpath()方法返回节点列表,这里去第一个元素,并打印其属性字典。第三行直接使用XPath表达式取相应节点的id属性,返回属性列表。第四行使用XPath表达式text()函数取节点的文本,返回文本列表,打印结果如下:
{'id': 'content'}
['content']
['阿甘正传']