xpath,全稱 xml path language,即ⅹml路徑語言,它是一門在xml文件中查詢資訊的語言。它最初是用來搜尋xml文件的,但是它同樣適用於html文件的搜尋。
xpath的選擇功能十分強大,它提供了非常簡潔明瞭的路徑選擇表示式。另外,它還提供了超過00個內建函式,用於字串、數值、時間的匹配以及節點、序列的處理等。幾乎所有我們想要定位的節點,都可以用 xpath來選擇。
示例如下:
from lxml import etree
text = '''
'''html = etree.html(text)
result = etree.tostring(html,encoding="utf-8",pretty_print=true,method="html")
print(result.decode('utf-8'))
這裡首先匯入lxml庫的 etree模組,然後宣告了一段html文字,呼叫html類進行初始化,這樣就成功構造了乙個 xpath解析物件。這裡需要注意的是,html文字是不完整的,但是 etree模組可以自動修正html文字。
這裡我們呼叫 tostring()方法即可輸出修正後的html**,但是結果是 bytes型別。這裡利用decode()方法將其轉成str型別。
如果響應html檔案中存在中文,那麼上面的**執行就會輸出亂碼,解決辦法:
xpath常用規則截圖
當然也可以指定節點名稱
from lxml import etree
html = etree.parse("text.html",parser=etree.htmlparser(encoding='utf-8'))
ts_result = etree.tostring(html,encoding='utf-8',pretty_print=true,method="html")
all_result = html.xpath('//*') #選取所有所有節點
li_result = html.xpath('//li') #選取所有li節點
li_a_result = html.xpath('//li/a') #選取所有li節點的所有直接a子節點
ul_a_result = html.xpath('//ul//a') #選取所有節點下的所有子孫a節點
class_result = html.xpath('//li/../@class') #獲取li節點的父節點的class屬性
herf_result = html.xpath('//li/a/@href') #獲取a節點的class屬性
title_result = html.xpath('//a[@class ="title"]') #選取class為title的a節點
print(li_result)
print(li_result[0])
print(li_a_result)
print(ul_a_result)
print(class_result)
print(title_result)
用xpath中的text()方法獲取節點中的文字
from lxml import etree
html = etree.parse("text.html",parser=etree.htmlparser(encoding='utf-8'))
li_text = html.xpath('//li/a/text()')
print(li_text)
#使用contains()函式進行屬性多值匹配
a_text = html.xpath('//a[contains(@class,"test")]/text()')
print(a_text)
#用and或者or進行多屬性匹配
li_text = html.xpath('//li/a[@class = "title" or @calss = "date"]/text()')
print(li_text)
##按序選擇
result = html.xpath('//li[1]/a/text()') #選取第乙個li節點的內容
print(result)
result = html.xpath('//li[last()]/a/text()') #選取最後乙個li節點的內容
print(result)
result = html.xpath('//li[position()<3]/a/text()') #選取位置小於3的li節點
print(result)
result = html.xpath('//li[last()-2]/a/text()') #選取倒數第三個li節點
print(result)
##節點軸選擇
result = html.xpath('//li[1]/ancestor::*')
print(result)
result = html.xpath('//li[1]/ancestor::div')
print(result)
result = html.xpath('//li[1]/attribute::*')
print(result)
result = html.xpath ('//li[1]/child::a[@class="tittle"]')
print(result)
result= html.xpath('//li[ 1]/descendant::span')
print(result)
result =html.xpath('//li[1]/following::*[2]')
print (result)
result= html.xpath('//li[1]/following-sibling::*')
print(result)
第一次選擇時,我們呼叫了ancestor軸,可以獲取所有祖先節點。其後需要跟兩個冒號,然後是節點的選擇器,這裡我們直接使用*,表示匹配所有節點
第二次選擇時,我們又加了限定條件,這次在冒號後面加了div,這樣得到的結果就只有div這個祖先節點了。
第三次選擇時,我們呼叫了attribute軸,可以獲取所有屬性值,其後跟的選擇器還是*,這代表獲取節點的所有屬性,返回值就是li節點的所有屬性值。
第四次選擇時,我們呼叫了chid軸,可以獲取所有直接子節點。這裡我們又加了限定條件,選取class屬性為title的a節點。
第五次選擇時,我們呼叫了descendant軸,可以獲取所有子孫節點。這裡我們又加了限定條件獲取span節點,所以返回的結果只包含span節點而不包含a節點。
第六次選擇時,我們呼叫了folling軸,可以獲取當前節點之後的所有節點。這裡我們雖然使用的是*匹配,但又加了索引選擇,所以只獲取了第二個後續節點。
第七次選擇時,我們呼叫了following-sibling軸,可以獲取當前節點之後的所有同級節點。這裡我們使用*匹配,所以獲取了所有後續同級節點。
lxml類庫的xpath的使用
為什麼要學習lxml類庫和xpath呢?lxml類庫是一款高效能的python html xml解析器,我們可以利用xpath,來快速地定位特定元素以及獲取節點資訊。xpath是一門在html xml文件中查詢資訊的語言,可用來在html xml文件中對元素和屬性進行遍歷。xml和html的區別?x...
Python解析庫(一) 使用XPath
xpath最初是用來搜尋xml文件的,但是同樣可以用來解析html文件 表示式 描述 nodename 選取此節點的所有子節點 從當前節點擊取直接子節點 從當前節點擊取子孫節點 選取當前節點 選取當前節點的父節點 選取屬性 例如 title lang eng 這是乙個xpath規則,他代表選取所有名...
python3 爬蟲 XPath庫的使用
xpath常用規則 小技巧 生成xpath,只需右鍵copy選擇copy xpath即可,截圖截不下來,自行嘗試 屬性定位 找到class屬性值為song的div標籤 div class song 層級 索引定位 找到class屬性值為tang的div的直系子標籤ul下的第二個子標籤li下的直系子標...