日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python解析庫Lxml與Xpath用法總結(jié)

本文主要圍繞以xpath和lxml庫進(jìn)行展開:

10年積累的網(wǎng)站制作、網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有湯旺免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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

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

一、xpath

1.xpath概念

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

2.xpath節(jié)點

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

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

3.xpath語法

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

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

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

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

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

謂語(Predicates)

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

謂語被嵌在方括號中。

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

路徑表達(dá)式 結(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 元素,且這些元素?fù)碛兄禐?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é)點。

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

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

選取若干路徑

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

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

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

4.xpath 軸

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

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

5.xpath運算符

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

運算符 描述 實例 返回值
|計算兩個節(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)頁。

導(dǎo)入包:

 
 
 
 
  1. from lxml import  etree 

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

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

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

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

那么我們怎么獲取這些標(biāo)簽和標(biāo)簽對應(yīng)的屬性值了,很簡單,首先獲取標(biāo)簽只需你這樣做:

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

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

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

2.表達(dá)式外獲取

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

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

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

表達(dá)式 描述
nodename選取此節(jié)點的所有子節(jié)點
/從當(dāng)前節(jié)點選取直接子節(jié)點
//從當(dāng)前節(jié)點選取子孫節(jié)點
.選取當(dāng)前節(jié)點
..選取當(dāng)前節(jié)點的父節(jié)點
@選取屬性
 
 
 
 
  1. html = lxml.etree.HTML(text) 
  2. #使用text構(gòu)造一個XPath解析對象,etree模塊可以自動修正HTML文本 
  3. html = lxml.etree.parse('./ex.html',etree.HTMLParser()) 
  4. #直接讀取文本進(jìn)行解析 
  5. from lxml import etree 
  6. result = html.xpath('//*') 
  7. #選取所有節(jié)點 
  8. result = html.xpath('//li') 
  9. #獲取所有l(wèi)i節(jié)點 
  10. result = html.xpath('//li/a') 
  11. #獲取所有l(wèi)i節(jié)點的直接a子節(jié)點 
  12. result = html.xpath('//li//a') 
  13. #獲取所有l(wèi)i節(jié)點的所有a子孫節(jié)點 
  14. result = html.xpath('//a[@href="link.html"]/../@class') 
  15. #獲取所有href屬性為link.html的a節(jié)點的父節(jié)點的class屬性 
  16. result = html.xpath('//li[@class="ni"]') 
  17. #獲取所有class屬性為ni的li節(jié)點 
  18. result = html.xpath('//li/text()') 
  19. #獲取所有l(wèi)i節(jié)點的文本 
  20. result = html.xpath('//li/a/@href') 
  21. #獲取所有l(wèi)i節(jié)點的a節(jié)點的href屬性 
  22. result = html.xpath('//li[contains(@class,"li")]/a/text()) 
  23. #當(dāng)li的class屬性有多個值時,需用contains函數(shù)完成匹配 
  24. result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()') 
  25. #多屬性匹配 
  26. result = html.xpath('//li[1]/a/text()') 
  27. result = html.xpath('//li[last()]/a/text()') 
  28. result = html.xpath('//li[position()<3]/a/text()') 
  29. result = html.xpath('//li[last()-2]/a/text()') 
  30. #按序選擇,中括號內(nèi)為XPath提供的函數(shù) 
  31. result = html.xpath('//li[1]/ancestor::*') 
  32. #獲取祖先節(jié)點 
  33. result = html.xpath('//li[1]/ancestor::div') 
  34. result = html.xpath('//li[1]/attribute::*') 
  35. #獲取屬性值 
  36. result = html.xpath('//li[1]/child::a[@href="link1.html"]') 
  37. #獲取直接子節(jié)點 
  38. result = html.xpath('//li[1]/descendant::span') 
  39. #獲取所有子孫節(jié)點 
  40. result = html.xpath('//li[1]/following::*[2]') 
  41. #獲取當(dāng)前節(jié)點之后的所有節(jié)點的第二個 
  42. result = html.xpath('//li[1]/following-sibling::*') 
  43. #獲取后續(xù)所有同級節(jié)點 

3.lxml案例

為了偷懶,小編決定還是采用urllib那篇文章的代碼,哈哈哈,機(jī)智如我。

好了,今天就講這么多,大家感興趣的話可以多多關(guān)注哦,精彩不停息!!!!

本文參考文獻(xiàn):

https://www.w3school.com.cn/

本文轉(zhuǎn)載自微信公眾號「IT共享之家」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系IT共享之家公眾號。


本文名稱:Python解析庫Lxml與Xpath用法總結(jié)
網(wǎng)址分享:http://www.5511xx.com/article/dhodice.html