1. 程式人生 > >python3爬蟲基礎-XPth路徑語言

python3爬蟲基礎-XPth路徑語言

簡介

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 孫節點。