XPath(XML Path Language) 是一門在XML和HTML文檔中查找信息的語言,可用來在XML和HTML文檔中對元素和屬性進行遍歷。html
https://jingyan.baidu.com/article/1e5468f94694ac484861b77d.html函數
https://blog.csdn.net/menofgod/article/details/75646443工具
這個就要看我寫的selenium基礎中的文章了。性能
http://www.javashuo.com/article/p-bjbzauue-h.html學習
lxml是一個HTML/XML的解析庫,主要功能是如何解析和提取HTML/XML數據。開發工具
lxml和正則是同樣,也是用C語言實現的,是一款高性能的Python HTML/XML解析器,能夠利用以前學習的XPath語法,來快速定位特定元素以及節點信息。ui
可經過 pip 安裝:spa
pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com.net
咱們能夠利用它來解析HTML 代碼,且在解析 HTML 代碼的時候,若是 HTML 代碼不規範,他會自動進行補全。插件
from lxml.html import etree htmlText = ''' <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div> ''' # 利用 etree.HTML,將字符串解析爲 HTML 文檔 html = etree.HTML(htmlText) # 按字符串序列化 HTML 文檔 result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8') print(result)
除了直接使用字符串進行解析,lxml 還支持從文件中讀取內容。
html代碼:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title></title> </head> <body> <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div> </body> </html>
而後利用etree.parse()方法來讀取文件。
from lxml.html import etree html = etree.parse('./hello.html') result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8') print(result)
結果:
咱們看到竟然報錯了,爲何呢?
之因此使用etree.parse()方法解析 html 內容時,會報lxml.etree.XMLSyntaxError的錯,是由於etree.parse()默認使用的是XML的解析器,因此當html內容不規範,好比出現某個標籤缺乏閉合標籤時,就會報這個錯誤。這時,可以使用etree.HTMLParser()建立一個HTML的解析器,而後做爲etree.parse()方法的參數便可。
from lxml.html import etree htmlParser = etree.HTMLParser(encoding='utf-8') html = etree.parse('./hello.html', parser=htmlParser) result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8') print(result)
使用XPath語法,應該使用Element.xpath語法,來執行XPath的選擇。
xpath函數返回的永遠是一個列表。
咱們先來匹配下li標籤和a標籤
from lxml.html import etree htmlParser = etree.HTMLParser(encoding='utf-8') html = etree.parse('./hello.html', parser=htmlParser) lis = html.xpath('//li') for li in lis: print(etree.tostring(li, encoding='utf-8', pretty_print=True).decode('utf-8'), end='') aList = html.xpath('//a/@href') for a in aList: print(a)
得到li標籤下a標籤的href屬性和內容:
from lxml.html import etree htmlParser = etree.HTMLParser(encoding='utf-8') html = etree.parse('./hello.html', parser=htmlParser) lis = html.xpath('//li') for li in lis: # . 號表示在當前的 li 元素下去匹配 href = li.xpath('.//a/@href')[0] #獲取 a 標籤的 href 屬性 txt = li.xpath('.//a/text()')[0] #獲取 a 標籤的文本 print(href, txt)