溫馨提示×

溫馨提示×

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

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

怎么在Python中使用xpath解析HTML

發布時間:2021-04-30 16:52:52 來源:億速云 閱讀:165 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關怎么在Python中使用xpath解析HTML,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

python有哪些常用庫

python常用的庫:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

HTML文檔: 

<html>
 <body>
  <form>
   <div id='leftmenu'>
    <h4>text</h4>
    <ul id='china'><!-- first location -->
     <li>...</li>
     <li>...</li>
       ......
    </ul>
    <ul id='england'><!-- second location-->
     <li>...</li>
     <li>...</li>
       ......
    </ul>
   </div>
  </form>
 </body>
</html>

直接使用lxml處理:

 import codecs
 from lxml import etree
 f=codecs.open("ceshi.html","r","utf-8")
 content=f.read()
 f.close()
 tree=etree.HTML(content)

etree提供了HTML這個解析函數,現在我們可以直接對HTML使用xpath了,是不是有點小激動,現在就嘗試下吧。

在使用xpath之前我們先來看看作為對照的jQuery和RE。

在jQuery里要處理這種東西就很簡單,特別是假如那個ul節點有id的話(比如是<ul id='china'>):

$("#china").each(function(){...});

具體到此處是:

復制代碼 代碼如下:

$("#leftmenu").children("h4:contains('text')").next("ul").each(function(){...});

找到id為leftmenu的節點,在其下找到一個內容包含為”text”的h4節點,再取其接下來的一個ul節點。

在python里要是用RE來處理就略麻煩一些:

block_pattern=re.compile(u"<h4>檔案</h4>(.*?)<h4>", re.I | re.S)
m=block_pattern.findall(content)
item_pattern=re.compile(u"<li>(.*?)</li>", re.I | re.S)
items=item_pattern.findall(m[0])
for i in items:
  print i

那么用xpath要怎么做呢?其實跟jQuery是差不多的:

nodes=tree.xpath("/descendant::ul[@id='china']")

當然,現在沒有id的話也就只能用類似于jQuery的方法了。完整的xpath應該是這樣寫的(注意,原文件中的TAG有大小寫的情況,但是在XPATH里只能用小寫):

復制代碼 代碼如下:

nodes=tree.xpath(u"/html/body/form/div[@id='leftmenu']/h4[text()='text']/following-sibling::ul[1]")

更簡單的方法就是像jQuery那樣直接根據id定位:

nodes=tree.xpath(u"//div[@id='leftmenu']/h4[text()='text']/following-sibling::ul[1]")

這兩種方法返回的結果中,nodes[0]就是那個“text”的h4節點后面緊跟的第一個ul節點,這樣就可以列出后面所有的ul節點內容了。

如果ul節點下面還有其他的節點,我們要找到更深節點的內容,如下的循環就是把這些節點的文本內容列出:

nodes=nodes[0].xpath("li/a")
for n in nodes:
  print n.text

對比三種方法應該可以看出xpath和jQuery對于頁面的解析都是基于XML的語義進行,而RE則純粹是基于plain text。RE對付簡單的頁面是沒有問題,如果頁面結構復雜度較高的時候(比如一堆的DIV來回嵌套之類),設計一個恰當的RE pattern可能會遠比寫一個xpath要復雜。特別是目前主流的基于CSS的頁面設計方式,其中大部分關鍵節點都會有id――對于使用jQuery的頁面來說則更是如此,這時xpath相比RE就有了決定性的優勢。

 附錄:基本XPATH語法介紹,詳細請參考XPath的官方文檔

XPATH基本上是用一種類似目錄樹的方法來描述在XML文檔中的路徑。比如用“/”來作為上下層級間的分隔。第一個“/”表示文檔的根節點(注意,不是指文檔最外層的tag節點,而是指文檔本身)。比如對于一個HTML文件來說,最外層的節點應該是”/html”。

同樣的,“..”和“.”分別被用來表示父節點和本節點。

XPATH返回的不一定就是唯一的節點,而是符合條件的所有節點。比如在HTML文檔里使用“/html/head/scrpt”就會把head里的所有script節點都取出來。

為了縮小定位范圍,往往還需要增加過濾條件。過濾的方法就是用“[”“]”把過濾條件加上。比如在HTML文檔里使用“/html/body/div[@id='main']”,即可取出body里id為main的div節點。

其中@id表示屬性id,類似的還可以使用如@name, @value, @href, @src, @class….

而 函數text()的意思則是取得節點包含的文本。比如:<div>hello<p>world</p>< /div>中,用”div[text()='hello']“即可取得這個div,而world則是p的text()。

函數position()的意思是取得節點的位置。比如“li[position()=2]”表示取得第二個li節點,它也可以被省略為“li[2]”。

不過要注意的是數字定位和過濾 條件的順序。比如“ul/li[5][@name='hello']”表示取ul下第五項li,并且其name必須是hello,否則返回空。而如果用 “ul/li[@name='hello'][5]”的意思就不同,它表示尋找ul下第五個name為”hello“的li節點。

此外,“*”可以代替所有的節點名,比如用”/html/body/*/span”可以取出body下第二級的所有span,而不管它上一級是div還是p或是其它什么東東。

而 “descendant::”前綴可以指代任意多層的中間節點,它也可以被省略成一個“/”。比如在整個HTML文檔中查找id為“leftmenu”的 div,可以用“/descendant::div[@id='leftmenu']”,也可以簡單地使用“ //div[@id='leftmenu']”。

至于“following-sibling::”前綴就如其名所說,表示同一層的下一個節點?!眆ollowing-sibling::*”就是任意下一個節點,而“following-sibling::ul”就是下一個ul節點。

以上就是怎么在Python中使用xpath解析HTML,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女