Python3解析HTML


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM