成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

肝了三天三夜,一文道盡 Python的 Xpath 解析!

開發 前端
大家在寫爬蟲時,往往獲取到網頁之后,需要從網頁中提取我們需要的信息。這時候就需要用到 xpath 或者 css 選擇器來定位頁面元素信息。

[[434465]]

大家在寫爬蟲時,往往獲取到網頁之后,需要從網頁中提取我們需要的信息。這時候就需要用到 xpath 或者 css 選擇器來定位頁面元素信息。但是,由于這兩者都是非人性化的語法,導致好多人望而生畏,經常為這個發愁。

今天我就嘗試用一篇文章來道盡 xpath 解析 HTML 的方方面面,希望大家看完這篇文章后,從此不再害怕 xpath 解析。

路徑表達式

  • nodename:選取此節點的所有子節點
  • /:從當前節點選取直接子節點
  • //:從當前接點選取子孫節點
  • .:選取當前節點
  • ..:選取當前接點的父節點
  • @:選取屬性

我們先放上一段 HTML 代碼:

  1. <html> 
  2.   <head> 
  3.     <title> 
  4.       Xpath test page 
  5.     </title> 
  6.   </head> 
  7.   <body> 
  8.     <div class="navli"
  9.       <span class="nav_tit"
  10.         <a href="https://www.baidu.com/"
  11.           百度 
  12.         </a> 
  13.         <i class="group" /> 
  14.       </span> 
  15.     </div> 
  16.     <div class="navli"
  17.       <span class="nav_tit"
  18.         <a href="https://news.cctv.com/"
  19.           新聞頻道 
  20.         </a> 
  21.       </span> 
  22.     </div> 
  23.     <div class="navli"
  24.       <span class="nav_tit"
  25.         <a href="https://sports.cctv.com/"
  26.           體育頻道 
  27.         </a> 
  28.       </span> 
  29.     </div> 
  30.   </body> 
  31. </html> 

接下來,我們針對這段 HTML 代碼來進行 xpath 解析。

要進行 xpath 解析,我們先要將 HTML 文本轉化成對象:

  1. from lxml import etree 
  2.  
  3. text = ''
  4. <div> 
  5.             <ul id='ultest'
  6.                  <li class="item-0"><a href="link1.html">first item</a></li> 
  7.                  <li class="item-1"><a href="link2.html">second item</a></li> 
  8.                  <li class="item-inactive"><a href="link3.html">third item</a></li> 
  9.                  <li class="item-1"><a href="link4.html"><span>fourth item</span></a></li> 
  10.                  <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此處缺少一個 </li> 閉合標簽 
  11.              </ul> 
  12.          </div> 
  13. ''
  14. # 調用HTML類進行初始化,這樣就成功構造了一個XPath解析對象。 
  15. page = etree.HTML(text)     
  16. print(type(page)) 

我們可以看到打印的結果:

  1. <class 'lxml.etree._Element'

nodename

nodename 表示根據標簽名字選取標簽,注意只會選擇子標簽!比如:如果是兒子的兒子則選取不到。

  1. print(page.xpath("body")) 
  2.  
  3. //[<Element body at 0x1966d1c48c0>] 
  4.  
  5. print(page.xpath("ul")) 
  6.  
  7. // [] 

這個 nodename 我有點不是太清楚,當我使用 body 時,可以找到出 body 節點元素,但是使用 ul 時,找不到 ul 節點元素,打印的是空。這個網上搜索也沒有什么準確的答案,如果你知道這里面的原理,還請告訴我。

/

/ 表示從根節點選取一級一級篩選(不能跳)。

  1. print(page.xpath("/html")) 
  2.  
  3. // [<Element html at 0x27107f41100>] 
  4.  
  5. print(page.xpath("/body")) 
  6.  
  7. // [] 

可以看到,我選取根節點 html ,可以打印出根節點元素,而我選取 body 打印時,是找不到的,這個符號只能從根節點開始找。

//

// 表示從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。注意:是所有符合條件的。

  1. print(page.xpath("//li")) 
  2.  
  3. // [<Element li at 0x1cd2a325780>, <Element li at 0x1cd2a325840>, <Element li at 0x1cd2a3259c0>, <Element li at 0x1cd2a325b00>, <Element li at 0x1cd2a325ac0>] 

.

. 表示選取當前標簽。

  1. ul = page.xpath("//ul"
  2. print(ul) 
  3. print(ul[0].xpath(".")) 
  4. print(ul[0].xpath("./li")) 
  5.  
  6. // [<Element ul at 0x1cd2a325840>] 
  7. // [<Element ul at 0x1cd2a325840>] 
  8. // [<Element li at 0x1cd2a325700>, <Element li at 0x1cd2a325b00>, <Element li at 0x1cd2a325640>, <Element li at 0x1cd2a325ac0>, <Element li at 0x1cd2a325c00>] 

我們先定位到 ul 元素節點,這里的結果是一個列表,然后再打印當前節點列表的第一個 ul,接著我們打印這個 ul 節點的子節點 li。

..

.. 表示選取當前標簽的父節點。

  1. print(ul[0].xpath("..")) 
  2.  
  3. // [] 

這里打印第一個 ul 節點的父元素,也就是 div 。

@

@ 表示獲取標簽的屬性值。

  1. print(ul[0].xpath("@id")) 
  2.  
  3. // ['ultest'

我們打印第一個 ul 節點的 id 屬性,可以看到結果是 ‘ultest’。

謂語

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

  1. //a[n] n為大于零的整數,代表子元素排在第n個位置的<a>元素 
  2. //a[last()]   last()  代表子元素排在最后個位置的<a>元素 
  3. //a[last()-]  和上面同理,代表倒數第二個 
  4. //a[position()<3] 位置序號小于3,也就是前兩個,這里我們可以看出xpath中的序列是從1開始 
  5. //a[@href]    擁有href的<a>元素 
  6. //a[@href='www.baidu.com']    href屬性值為'www.baidu.com'的<a>元素 
  7. //book[@price>2]  price值大于2的<book>元素 

同樣的,我們來舉一些例子:

  1. # 第三個li標簽 
  2. print(page.xpath('//ul/li[3]')) 
  3. # 最后一個li標簽 
  4. print(page.xpath('//ul/li[last()]')) 
  5. # 倒數第二個li標簽 
  6. print(page.xpath('//ul/li[last()-1]')) 
  7. # 序號小于3的li標簽 
  8. print(page.xpath('//ul/li[position()<3]')) 
  9. # 有class屬性的li標簽 
  10. print(page.xpath('//li[@class]')) 
  11. # class屬性為item-inactive的li標簽 
  12. print(page.xpath("//li[@class='item-inactive']")) 

獲取文本

text()

我們用text()獲取某個節點下的文本:

  1. print(page.xpath('//ul/li/a/text()')) 
  2.  
  3. // ['first item''second item''third item''fourth item''fifth item'

string()

我們用string()獲取某個節點下所有的文本:

  1. print(page.xpath('string(//ul)')) 

輸出內容為:

  1. first item 
  2. second item 
  3. third item 
  4. fourth item 
  5. fifth item # 注意,此處缺少一個  閉合標簽 

fifth item # 注意,此處缺少一個 閉合標簽

通配符

  • * 任意元素
  • @* 任意屬性

* 表示匹配任何元素節點:

  1. print(page.xpath('//li/*')) 
  2.  
  3. // [<Element a at 0x208931f0f00>, <Element a at 0x208931f0f40>, <Element a at 0x208931f0c40>, <Element a at 0x208931f0d80>, <Element a at 0x208931ff080>] 

@* 表示匹配任何屬性節點:

  1. print(page.xpath('//li/@*')) 
  2.  
  3. // ['item-0''item-1''item-inactive''item-1''item-0'

或運算

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

  1. # 選取所有的li和a節點 
  2. print(page.xpath("//li|//a")) 
  3.  
  4. // [<Element li at 0x29bb7190ac0>, <Element a at 0x29bb7190b00>, <Element li at 0x29bb7190f00>, <Element a at 0x29bb7190dc0>, <Element li at 0x29bb7190fc0>, <Element a at 0x29bb7190e00>, <Element li at 0x29bb7190f80>, <Element a at 0x29bb71b1080>, <Element li at 0x29bb71b1040>, <Element a at 0x29bb7190cc0>] 

函數

xpath內置很多函數。更多函數查看https://www.w3school.com.cn/xpath/xpath_functions.asp。

  • contains(string1,string2)
  • starts-with(string1,string2)
  • text()
  • last()
  • position()
  • node()

contains

有的時候,class作為選擇條件的時候不合適@class='....' 這個是完全匹配,當網頁樣式發生變化時,class或許會增加或減少像active的class。用contains就能很方便。

  1. print(page.xpath("//*[contains(@class, 'item-inactive')]")) 
  2.  
  3. // [] 

starts-with

  1. print(page.xpath("//*[starts-with(@class, 'item-inactive')]")) 
  2. // [<Element li at 0x1a297641d00>] 

其他幾個函數,我們在上面使用過。注意,并不是所有的 xpath 函數python都會支持,比如 ends-with(string1,string2) 和 upper-case(string) 就不支持。

節點軸選擇

ancestor軸

調用 ancestor 軸,獲取所有祖先節點。其后需要跟兩個冒號,然后是節點的選擇器。返回結果:第一個li節點的所有祖先節點。

  1. print(page.xpath('//li[1]/ancestor::*')) 
  2.  
  3. // [, , , ] 

attribute軸

調用 attribute 軸,獲取所有屬性值。返回結果:li節點的所有屬性值。

  1. print(page.xpath('//li[1]/attribute::*')) 
  2.  
  3. // ['item-0'

child軸

調用 child 軸,獲取所有直接子節點。返回結果:選取 href 屬性為 link1.html 的 a 子節點。

  1. print(page.xpath('//li[1]/child::a[@href="link1.html"]')) 
  2.  
  3. // [<Element a at 0x13972af5b40>] 

descendant軸

調用 descendant 軸,獲取所有子孫節點。同時加了限定條件。返回結果:選取 li 節點下的子孫節點里的 span 節點。

  1. print(page.xpath('//li[4]/descendant::span')) 
  2.  
  3. // [<Element span at 0x1a4d5700d00>] 

following軸

調用 following 軸,獲取當前節點之后的所有節點。

  1. print(page.xpath('//li[4]/following::*[2]')) 
  2.  
  3. // [<Element a at 0x1583f8c0d00>] 

following-sibling軸

調用 following-sibling 軸,獲取當前節點之后的所有同級節點。

  1. print(page.xpath('//li[4]/following-sibling::*')) 
  2.  
  3. // [] 

總結

到這里,我們的 xpath 學習之路就結束了,文章中基本涵蓋了大家需要用的的 xpath 解析方法。大家看一遍沒記住不要緊,以后遇到此類解析直接搬出這篇文章對照著寫就行。

 

責任編輯:武曉燕 來源: Python技術
相關推薦

2014-08-04 13:56:42

安卓概念

2022-01-12 10:57:59

網絡

2021-11-23 23:13:11

數據庫安全工具

2021-04-30 05:45:41

多線程Java基礎面試題

2020-11-16 09:02:38

Python開發工具

2020-11-24 10:13:02

Redis集群數據庫

2020-01-30 10:30:32

AI 數據人工智能

2020-01-07 14:24:18

人工智能機器學習技術

2021-01-04 14:59:50

AIAI技術機器學習

2021-05-14 14:01:31

加密貨幣網絡安全加密錢包

2024-01-29 09:04:15

Wi-Fi數據設備

2024-09-19 09:12:50

RAG系統技術

2025-04-07 08:20:00

ORMPython代碼

2020-06-30 08:27:56

Python開發工具

2011-09-30 09:29:19

TechCruch創業2010年

2024-03-28 10:08:31

自動駕駛工具

2021-04-04 22:58:20

互聯網IP網絡協議

2024-08-05 13:00:00

2019-08-28 08:58:18

技術物聯網云計算

2022-08-31 09:39:32

自動駕駛芯片技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕成人免费视频 | 欧美国产精品一区二区 | 久久精品小视频 | 欧美一区二区三区四区视频 | 91久久综合| 亚洲欧美中文日韩在线v日本 | 日本电影免费完整观看 | 99久久婷婷国产综合精品电影 | 亚洲在线成人 | 中文字幕福利视频 | 久久免费精彩视频 | 最新中文字幕第一页视频 | 精品一区久久 | 天天射美女 | 亚洲一区二区在线播放 | 久久国产精品无码网站 | 不卡一二三区 | 日韩欧美在线观看 | 亚洲国产欧美91 | 黄色片视频免费 | 亚洲aⅴ一区二区 | 亚洲视频免费观看 | 一区二区成人 | 日韩精品免费一区二区在线观看 | 色视频www在线播放国产人成 | 国产91av视频 | 黄色毛片一级 | www.色综合| 日韩久久久久久 | 国产精品日日夜夜 | 国产精品视屏 | 精品国产乱码久久久久久中文 | 四虎最新视频 | 欧美一卡二卡在线观看 | www久久久 | 国内精品视频在线观看 | 成人在线播放网址 | 91九色在线观看 | 91n成人 | 久久九九影视 | av在线播放网站 |