python3爬蟲基礎-XPth路徑語言
阿新 • • 發佈:2019-05-19
簡介
XPth,全稱XML Path Language,即XML路徑語言。可以快速便捷的從XML文件中查詢資訊的語言,同樣適用於HTML文件。
XPth常用規則
路徑表示式
表示式 | 描述 |
---|---|
nodename | 選取此節點的所有子節點 |
/ | 從當前節點選取直接子節點 |
// | 從當前節點選擇孫節點 |
. | 選取當前節點 |
.. | 選取當前節點的父級節點 |
@ | 選取屬性 |
/text() | 獲取標籤物件文字 |
萬用字元匹配
萬用字元 | 描述 |
---|---|
* | 匹配任何元素節點 |
@* | 匹配任何屬性節點 |
node() | 匹配任何型別的節點 |
綜合示例
# -*- coding:utf8 -*- from lxml import etree text = """ <html> <div class="test1">第一個div測試標籤 <p>測試 P 標籤 </div> <div class="test2 test3">第二個div測試標籤 <span>測試 span 標籤 </span> </div> </html> """ html = etree.HTML(text) # 構造 XPth 解析物件 # html = etree.parse('./test.html',etree.HTMLParser()) # 讀取本地 HTML 方法 r = etree.tostring(html).decode('utf8') # etree.tostring() 方法將HTML標籤程式碼修正,補全了示例中未閉合的<P>標籤和加入了<body>標籤 # 預設顯示為bytes型別,後邊跟decode轉換為utf8格式 print("修正後的HTML資訊:",r) print("################# 路徑獲取指定型別節點 ########################") print("獲取子級標籤物件:" ,html.xpath('/html')) print("獲取孫級標籤物件:" ,html.xpath('//div')) print("獲取指定級別所有標籤物件:" ,html.xpath('//*')) print("匹配任何型別的節點:" ,html.xpath('//node()')) print("################## 路徑獲取節點[按序選擇] ######################") print("下標取第一個物件:",html.xpath('//div')[0]) print("謂語引數取最後一個物件:",html.xpath('//div[last()]')) print("謂語引數取倒數第二個物件:",html.xpath('//div[last()-1]')) print("################### 獲取節點標籤物件文字 #######################") print("獲取某標籤物件文字:" ,html.xpath('//span/text()')) print("####################### 屬性獲取節點 ###########################") print("匹配所有帶屬性的標籤",html.xpath('//div[@*]//text()')) print("屬性獲取標籤:" ,html.xpath('//div[@class]/text()')) print("屬性含值獲取標籤:" ,html.xpath('//div[@class="test1"]/text()')) print("多屬性包含獲取標籤",html.xpath('//div[contains(@class,"test2")]//text()'))
XPath 軸
軸名稱 | 描述 |
---|---|
ancestor | 選取當前節點的所有先輩(父、祖父等) |
ancestor-or-self | 選取當前節點的所有先輩(父、祖父等)以及當前節點本身 |
attribute | 選取當前節點的所有屬性 |
child | 選取當前節點的所有子元素 |
descendant | 選取當前節點的所有後代元素(子、孫等) |
descendant-or-self | 選取當前節點的所有後代元素(子、孫等)以及當前節點本身 |
following | 選取文件中當前節點的結束標籤之後的所有節點 |
namespace | 選取當前節點的所有名稱空間節點 |
parent | 選取當前節點的父節點 |
preceding | 選取文件中當前節點的開始標籤之前的所有節點 |
preceding-sibling | 選取當前節點之前的所有同級節點 |
self | 選取當前節點 |
絕對位置路徑:
/step/step/...
相對位置路徑:
step/step/...
每個步均根據當前節點集之中的節點來進行計算。
步(step)包括:
- 軸(axis)定義所選節點與當前節點之間的樹關係
- 節點測試(node-test)識別某個軸內部的節點
- 零個或者更多謂語(predicate)更深入地提煉所選的節點集
步的語法:
軸名稱::節點測試[謂語]
示例
例子 | 結果 |
---|---|
child::book | 選取所有屬於當前節點的子元素的 book 節點。 |
attribute::lang | 選取當前節點的 lang 屬性。 |
child::* | 選取當前節點的所有子元素。 |
attribute::* | 選取當前節點的所有屬性。 |
child::text() | 選取當前節點的所有文字子節點。 |
child::node() | 選取當前節點的所有子節點。 |
descendant::book | 選取當前節點的所有 book 後代。 |
ancestor::book | 選擇當前節點的所有 book 先輩。 |
ancestor-or-self::book | 選取當前節點的所有 book 先輩以及當前節點(如果此節點是 book 節點) |
child::*/child::price | 選取當前節點的所有 price 孫節點。 |