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']
['阿甘正傳']