XPath語法和lxml模組(上)

2021-10-24 07:45:11 字數 4607 閱讀 2590

xpath(xml path language)是一門在xml和html文件中查詢資訊的語言,可用來在xml和html文件中對元素和屬性進行遍歷。

chrome外掛程式xpath helper。

firefox外掛程式try xpath。

xpath 使用路徑表示式來選取 xml 文件中的節點或者節點集。這些路徑表示式和我們在常規的電腦檔案系統中看到的表示式非常相似。

表示式描述

示例結果

nodename

選取此節點的所有子節點

bookstore

選取bookstore下所有的子節點

/如果是在最前面,代表從根節點擊取。否則選擇某節點下的某個節點

/bookstore

選取根元素下所有的bookstore節點

//從全域性節點中選擇節點,隨便在哪個位置

//book

從全域性節點中找到所有的book節點,獲取整個頁面中的元素

@選取某個節點的屬性

//book[@price]

選擇所有擁有price屬性的book節點

.當前節點

./a選取當前節點下的a標籤

/和//的區別:/代表只獲取直接子節點。//獲取子孫節點。一般//用得比較多。當然也要視情況而定。

contains:有時候某個屬性中包含了多個值,那麼可以使用contains函式。示例**如下:

//div[contains(@class,'job_detail')]

謂詞中的下標是從1開始的,不是從0開始的。

xpath函式返回的始終是乙個列表,提取元素的時候需要加下標

html.xpath("//tr[position()>1]") #獲取所有tr標籤,不包含第乙個

html.xpath("//tr[@class=『kangbazi』]/td/text()")[0] #獲取td標籤的所有文字內容

html.xpath(".//td//a/@href") #屬性前面必須加@

謂語用來查詢某個特定的節點或者包含某個指定的值的節點,被嵌在方括號中。

在下面的**中,我們列出了帶有謂語的一些路徑表示式,以及表示式的結果:

路徑表示式

描述/bookstore/book[1]

選取bookstore下的第乙個子元素

/bookstore/book[last()]

選取bookstore下的倒數第二個book元素。

bookstore/book[position()< 3]

選取bookstore下前面兩個子元素。

//book[@price]

選取擁有price屬性的book元素

//book[@price=10]

選取所有屬性price等於10的book元素

*表示萬用字元。

萬用字元描述

示例結果

*匹配任意節點

/bookstore/*

選取bookstore下的所有子元素。

@*匹配節點中的任何屬性

//book[@*]

選取所有帶有屬性的book元素。

通過在路徑表示式中使用「|」運算子,可以選取若干個路徑。

示例如下:

//bookstore/book | //book/title

# 選取所有book元素以及book元素下所有的title元素

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-pklemggs-1599195119208)(qqtu%20pian%2020171124194846.png)]

lxml 是 乙個html/xml的解析器,主要的功能是如何解析和提取 html/xml 資料。

lxml和正則一樣,也是用 c 實現的,是一款高效能的 python html/xml 解析器,我們可以利用之前學習的xpath語法,來快速的定位特定元素以及節點資訊。

lxml python 官方文件:

需要安裝c語言庫,可使用 pip 安裝:pip install lxml

我們可以利用他來解析html**,並且在解析html**的時候,如果html**不規範,他會自動的進行補全。示例**如下:

# 使用 lxml 的 etree 庫

from lxml import etree

text = '''

'''#利用etree.html,將字串解析為html文件

html = etree.html(text)

# 按字串序列化html文件

result = etree.tostring(html)

print(result)

輸入結果如下:

可以看到。lxml會自動修改html**。例子中不僅補全了li標籤,還新增了body,html標籤。

除了直接使用字串進行解析,lxml還支援從檔案中讀取內容。我們新建乙個hello.html檔案:

然後利用etree.parse()方法來讀取檔案。示例**如下:

from lxml import etree

# 讀取外部檔案 hello.html

html = etree.parse('hello.html')

result = etree.tostring(html, pretty_print=true)

print(result)

輸入結果和之前是相同的。

獲取所有li標籤:

from lxml import etree

html = etree.parse('hello.html')

print type(html) # 顯示etree.parse() 返回型別

result = html.xpath('//li')

print(result) # 列印標籤的元素集合

獲取所有li元素下的所有class屬性的值:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li/@class')

print(result)

獲取li標籤下href為www.baidu.com的a標籤:

獲取li標籤下所有span標籤:

from lxml import etree

html = etree.parse('hello.html')

#result = html.xpath('//li/span')

#注意這麼寫是不對的:

#因為 / 是用來獲取子元素的,而 並不是 的子元素,所以,要用雙斜槓

result = html.xpath('//li//span')

print(result)

獲取li標籤下的a標籤裡的所有class:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li/a//@class')

print(result)

獲取最後乙個li的a的href屬性對應的值:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()]/a/@href')

# 謂語 [last()] 可以找到最後乙個元素

print(result)

獲取倒數第二個li元素的內容:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()-1]/a')

# text 方法可以獲取元素內容

print(result[0].text)

獲取倒數第二個li元素的內容的第二種方式:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()-1]/a/text()')

print(result)

萬水千山總是情,點個關注行不行。

你的乙個小小舉動,將是我分享更多乾貨的動力。

XPath語法和lxml模組

xpath xml path language 是一門在xml和html文件中查詢資訊的語言,可用來在xml和html文件中對元素和屬性進行遍歷。chrome外掛程式xpath helper。安裝方法 開啟外掛程式伴侶,選擇外掛程式 選擇提取外掛程式內容到桌面,桌面上會多乙個資料夾 把資料夾放入想要...

XPath語法和lxml模組

xpath xml path language 是一門在xml和html文件中查詢資訊的語言,可用來在xml和html文件中對元素和屬性進行遍歷。chrome外掛程式xpath helper。firefox外掛程式try xpath。xpath 使用路徑表示式來選取 xml 文件中的節點或者節點集。...

例項帶你快速入門XPath語法和lxml模組

xpath xml path language 是一門在xml和html文件中查詢資訊的語言,可用來在xml和html文件中對元素和屬性進行遍歷。chrome外掛程式xpath helper。firefox外掛程式try xpath。xpath 使用路徑表示式來選取 xml 文件中的節點或者節點集。...