究竟什麼是 xpath 呢?簡單來講,xpath 就是一種在 XML 文檔中查找信息的語言css
而 XML 文檔就是由一系列節點構成的樹,例如,下面是一份簡單的 XML 文檔:html
<html> <body> <div> <p>Hello world<p> <a href="/home">Click here</a> </div> </body> </html>
XML 文檔中常見的節點包括:python
XML 文檔中常見的節點間關係包括:web
對於網頁解析來講,xpath 比 re 更加方便簡潔,故 Python 中也提供相應的模塊 —— lxml.etree網絡
咱們能夠使用 pip install lxml
命令進行安裝測試
在正式開始講解 xpath 的使用方法以前,咱們先來構造一個簡單的 XML 文檔用於測試url
在通常的爬蟲程序中,XML 文檔就是爬取回來的網頁源代碼翻譯
>>> sc = ''' <html> <head> <meta charset="UTF-8"/> <link rel="stylesheet" href="style/base.css"/> <title>Example website</title> </head> <body> <div id="images" class="content"> <a href="image1.html">Image1<img src="image1.jpg"/></a> <a href="image2.html">Image2<img src="image2.jpg"/></a> <a href="image3.html">Image3<img src="image3.jpg"/></a> </div> </body> </html> '''
>>> from lxml import etree
>>> html = etree.HTML(sc) # 構造 lxml.etree._Element 對象 >>> # lxml.etree._Element 對象還具備代碼補全功能 >>> # 假如咱們獲得的 XML 文檔不是規範的文檔,該對象將會自動補全缺失的閉合標籤 >>> # 咱們能夠使用 tostring() 方法將對象轉化成 bytes 類型的字符串 >>> # 再使用 decode('utf-8') 方法將 bytes 類型的字符串轉化爲 str 類型的字符串 >>> print(etree.tostring(html).decode('utf-8'))
咱們能夠使用 xpath() 方法進行匹配code
xpath 方法接受一個知足 xpath 匹配語法的字符串做爲參數xml
下面主要介紹一下 xpath 匹配語法:
/
表示子代節點,例如 /E 表示匹配根節點下的子節點中的 E 元素節點
>>> test = html.xpath('/html/head/title')
//
表示後代節點,例如 //E 表示匹配根節點下的後代節點中的 E 元素節點
>>> test = html.xpath('//a')
*
表示全部節點,例如 E/* 表示匹配 E 元素節點下的子節點中的全部節點
>>> test = html.xpath('/html/*')
text()
表示文本節點,例如 E/text() 表示匹配 E 元素節點下的子節點中的文本節點
>>> test = html.xpath('/html/head/title/text()')
@ATTR
表示屬性節點,例如 E/@ATTR 表示匹配 E 元素節點下的子節點中的 ATTR 屬性節點
>>> test = html.xpath('//a/@href')
謂語
用於匹配指定的標籤
指定第二個 <a> 標籤
>>> test = html.xpath('//a[2]')
指定前兩個 <a> 標籤
>>> test = html.xpath('//a[position()<=2]')
指定帶有 href 屬性的 <a> 標籤
>>> test = html.xpath('//a[@href]')
指定帶有 href 屬性且值爲 image1.html 的 <a> 標籤
>>> test = html.xpath('//a[@href="image1.html"]')
指定帶有 href 屬性且值包含 image 的 <a> 標籤
>>> test = html.xpath('//a[contains(@href,"image")]')
xpath 方法返回字符串或者匹配列表,匹配列表中的每一項都是 lxml.etree._Element 對象
下面主要介紹一下 _Element 對象的經常使用屬性與方法:
咱們先用 xpath 方法獲得匹配列表 tests 做爲測試樣例,tests 中的每一項都是一個 _Element 對象
>>> test = html.xpath('//a[@href="image1.html"]') >>> obj = test[0]
tag
返回標籤名>>> obj.tag 'a'
attrib
返回屬性與值組成的字典>>> obj.attrib {'href': 'image1.html'}
get()
返回指定屬性的值>>> obj.get('href') 'image1.html'
text
返回文本值>>> obj.text 'Image1'
【參考資料】
【爬蟲系列相關文章】