溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中Lxml與Xpath解析庫如何使用

發(fā)布時間:2021-07-10 16:38:50 來源:億速云 閱讀:133 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)Python中Lxml與Xpath解析庫如何使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、xpath 概念、xpath節(jié)點、xpath語法、xpath軸、xpath運算符

二、lxml的安裝、lxml的使用、lxml案例

一、xpath

1.xpath概念

XPath 是一門在 XML 文檔中查找信息的語言。XPath 使用路徑表達式在 XML 文檔中進行導航 。XPath 包含一個標準函數(shù)庫 。XPath  是 XSLT 中的主要元素 。XPath 是一個 W3C 標準 。

2.xpath節(jié)點

xpath有七種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節(jié)點。

節(jié)點關(guān)系:父、子、兄弟、先輩、后輩。

3.xpath語法

xpath語法在W3c網(wǎng)站上有詳細的介紹,這里截取部分知識,供大家學習。

XPath 使用路徑表達式在 XML 文檔中選取節(jié)點。節(jié)點是通過沿著路徑或者 step 來選取的。下面列出了最有用的路徑表達式:

表達式描述
nodename選取此節(jié)點的所有子節(jié)點。
/從根節(jié)點選取。
//從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置。
.選取當前節(jié)點。
..選取當前節(jié)點的父節(jié)點。
@選取屬性。

在下面的表格中,我們已列出了一些路徑表達式以及表達式的結(jié)果:

路徑表達式結(jié)果
bookstore選取 bookstore 元素的所有子節(jié)點。
/bookstore選取根元素 bookstore。注釋:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!
bookstore/book選取屬于 bookstore 的子元素的所有 book 元素。
//book選取所有 book 子元素,而不管它們在文檔中的位置。
bookstore//book選擇屬于 bookstore 元素的后代的所有 book 元素,而不管它們位于 bookstore 之下的什么位置。
//@lang選取名為 lang 的所有屬性。

謂語(Predicates)

謂語用來查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點。

謂語被嵌在方括號中。

在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結(jié)果:

路徑表達式結(jié)果
/bookstore/book[1]選取屬于 bookstore 子元素的第一個 book 元素。
/bookstore/book[last()]選取屬于 bookstore 子元素的最后一個 book 元素。
/bookstore/book[last()-1]選取屬于 bookstore 子元素的倒數(shù)第二個 book 元素。
/bookstore/book[position()<3]選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。
//title[@lang]選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang='eng']選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
/bookstore/book[price>35.00]選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00。
/bookstore/book[price>35.00]/title選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于  35.00。

選取未知節(jié)點

XPath 通配符可用來選取未知的 XML 元素。

通配符描述
*匹配任何元素節(jié)點。
@*匹配任何屬性節(jié)點。
node()匹配任何類型的節(jié)點。

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結(jié)果:

路徑表達式結(jié)果
/bookstore/*選取 bookstore 元素的所有子元素。
//*選取文檔中的所有元素。
//title[@*]選取所有帶有屬性的 title 元素。

選取若干路徑

通過在路徑表達式中使用"|"運算符,您可以選取若干個路徑。

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結(jié)果:

路徑表達式結(jié)果
//book/title | //book/price選取 book 元素的所有 title 和 price 元素。
//title | //price選取文檔中的所有 title 和 price 元素。
/bookstore/book/title | //price選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price  元素。

4.xpath 軸

軸可定義相對于當前節(jié)點的節(jié)點集。

軸名稱結(jié)果
ancestor選取當前節(jié)點的所有先輩(父、祖父等)。
ancestor-or-self選取當前節(jié)點的所有先輩(父、祖父等)以及當前節(jié)點本身。
attribute選取當前節(jié)點的所有屬性。
child選取當前節(jié)點的所有子元素。
descendant選取當前節(jié)點的所有后代元素(子、孫等)。
descendant-or-self選取當前節(jié)點的所有后代元素(子、孫等)以及當前節(jié)點本身。
following選取文檔中當前節(jié)點的結(jié)束標簽之后的所有節(jié)點。
namespace選取當前節(jié)點的所有命名空間節(jié)點。
parent選取當前節(jié)點的父節(jié)點。
preceding選取文檔中當前節(jié)點的開始標簽之前的所有節(jié)點。
preceding-sibling選取當前節(jié)點之前的所有同級節(jié)點。
self選取當前節(jié)點。

5.xpath運算符

下面列出了可用在 XPath 表達式中的運算符:

運算符描述實例返回值
|計算兩個節(jié)點集//book | //cd返回所有擁有 book 和 cd 元素的節(jié)點集
+加法6 + 410
-減法6 - 42
*乘法6 * 424
div除法8 div 42
=等于price=9.80如果 price 是 9.80,則返回 true。如果 price 是 9.90,則返回 false。
!=不等于price!=9.80如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。
<小于price<9.80如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。
<=小于或等于price<=9.80如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。
>大于price>9.80如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。
>=大于或等于price>=9.80如果 price 是 9.90,則返回 true。如果 price 是 9.70,則返回 false。
orprice=9.80 or price=9.70如果 price 是 9.80,則返回 true。如果 price 是 9.50,則返回 false。
andprice>9.00 and price<9.90如果 price 是 9.80,則返回 true。如果 price 是 8.50,則返回 false。
mod計算除法的余數(shù)5 mod 21

好了,xpath的內(nèi)容就這么多了。接下來我們要介紹一個神器lxml,他的速度很快,曾經(jīng)一直是我使用beautifulsoup時最鐘愛的解析器,沒有之一,因為他的速度的確比其他的html.parser  和html5lib快了許多。

二、lxml

1.lxml安裝

lxml 是一個xpath格式解析模塊,安裝很方便,直接pip install lxml 或者easy_install lxml即可。

2.lxml 使用

lxml提供了兩種解析網(wǎng)頁的方式,一種是你解析自己寫的離線網(wǎng)頁時,另一種 則是解析線上網(wǎng)頁。

導入包:

from lxml import  etree

1.解析離線網(wǎng)頁:

html=etree.parse('xx.html',etree.HTMLParser()) aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h3/a[1]/@href') print(aa)

2.解析在線網(wǎng)頁:

from lxml import etree import requests rep=requests.get('https://www.baidu.com') html=etree.HTML(rep.text) aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h3/a[1]/@href') print(aa)

那么我們怎么獲取這些標簽和標簽對應的屬性值了,很簡單,首先獲取標簽只需你這樣做:

Python中Lxml與Xpath解析庫如何使用

然后我們可以,比方說,你要獲取a標簽內(nèi)的文本和它的屬性href所對應的值,有兩種方法,

1.表達式內(nèi)獲取

aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h3/a[1]/text()')  ab=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h3/a[1]/@href')

2.表達式外獲取

aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h3/a[1]')  aa.text  aa.attrib.get('href')

這樣就完成了獲取,怎么樣,是不是很簡單了,哈哈哈。

下面再來lxml的解析規(guī)則:

表達式描述
nodename選取此節(jié)點的所有子節(jié)點
/從當前節(jié)點選取直接子節(jié)點
//從當前節(jié)點選取子孫節(jié)點
.選取當前節(jié)點
..選取當前節(jié)點的父節(jié)點
@選取屬性
html = lxml.etree.HTML(text) #使用text構(gòu)造一個XPath解析對象,etree模塊可以自動修正HTML文本 html = lxml.etree.parse('./ex.html',etree.HTMLParser()) #直接讀取文本進行解析 from lxml import etree result = html.xpath('//*') #選取所有節(jié)點 result = html.xpath('//li') #獲取所有l(wèi)i節(jié)點 result = html.xpath('//li/a') #獲取所有l(wèi)i節(jié)點的直接a子節(jié)點 result = html.xpath('//li//a') #獲取所有l(wèi)i節(jié)點的所有a子孫節(jié)點 result = html.xpath('//a[@href="link.html"]/../@class') #獲取所有href屬性為link.html的a節(jié)點的父節(jié)點的class屬性 result = html.xpath('//li[@class="ni"]') #獲取所有class屬性為ni的li節(jié)點 result = html.xpath('//li/text()') #獲取所有l(wèi)i節(jié)點的文本 result = html.xpath('//li/a/@href') #獲取所有l(wèi)i節(jié)點的a節(jié)點的href屬性 result = html.xpath('//li[contains(@class,"li")]/a/text()) #當li的class屬性有多個值時,需用contains函數(shù)完成匹配 result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()') #多屬性匹配 result = html.xpath('//li[1]/a/text()') result = html.xpath('//li[last()]/a/text()') result = html.xpath('//li[position()<3]/a/text()') result = html.xpath('//li[last()-2]/a/text()') #按序選擇,中括號內(nèi)為XPath提供的函數(shù) result = html.xpath('//li[1]/ancestor::*') #獲取祖先節(jié)點 result = html.xpath('//li[1]/ancestor::div') result = html.xpath('//li[1]/attribute::*') #獲取屬性值 result = html.xpath('//li[1]/child::a[@href="link1.html"]') #獲取直接子節(jié)點 result = html.xpath('//li[1]/descendant::span') #獲取所有子孫節(jié)點 result = html.xpath('//li[1]/following::*[2]') #獲取當前節(jié)點之后的所有節(jié)點的第二個 result = html.xpath('//li[1]/following-sibling::*') #獲取后續(xù)所有同級節(jié)點

3.lxml案例

Python中Lxml與Xpath解析庫如何使用

以上就是Python中Lxml與Xpath解析庫如何使用,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI