xpath在HTML解析中的應用(加強版)

2021-08-24 19:23:45 字數 2382 閱讀 6709

經過一番研究以後才發現原來libxml2其實已經內建了對html的解析——即使是不很規範的html。所以上篇《xpath在xhtml解析中的應用 》完全是我學藝不精的產物。囧

不過好處是順便學習到了j7a7c7k7 兄推薦的tidy(用的是令狐提供的µtidylib ),這也是個好東東。

現在來看如何直接使用lxml(即前文說過的libxml2的乙個python binding)處理那個樣本「頁面 」:

import codecs

from lxml import etree

f=codecs.open("raptor.htm","r","utf-8")

content=f.read()

f.close()

tree=etree.html(content)

bingo!果然成功。關鍵就在於etree提供了html這個解析函式。之後的事情就好辦多了,因為可以直接對html使用xpath。

不過這個樣本頁面中要解析的部分有乙個問題就是:那個ul節點沒有id,所以只好麻煩一點了。

完整的xpath應該是這樣寫的(注意,原檔案中的tag有大小寫的情況,但是在xpath裡只能用小寫):

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

這句xpath的意思是尋找這樣乙個東東。

當然更簡單的方法就是直接根據id定位:

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

這兩種方法返回的結果中,nodes[0]就是那個「檔案」的h3節點後面緊跟的第乙個ul節點。

之後就可以把每個月份的文字列出(注意,是以上面取得的ul節點為起點):

nodes=nodes[0].xpath("li/a")

for n in nodes:

print n.text

這段的意思是取得這個ul節點下的所有節點。之後的迴圈就是把這些節點的文字內容列出。

我只能說libxml2實在是太強大了。

附錄: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()的意思則是取得節點包含的文字。比如:helloworld

< /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::」字首就如其名所說,表示同一層的下乙個節點。"following-sibling::*"就是任意下乙個節點,而「following-sibling::ul」就是下乙個ul節點。

更複雜的xpath語法還是請參考官文件《xml path language (xpath) 》。

Python中利用xpath解析HTML

在進行網頁抓取的時候,分析定位html節點是獲取抓取資訊的關鍵,目前我用的是lxml模組 用來分析xml文件結構的,當然也能分析html結構 利用其lxml.html的xpath對html進行分析,獲取抓取資訊。首先,我們需要安裝乙個支援xpath的python庫。目前在libxml2的 上被推薦的...

xpath在XHTML解析中的應用

前一陣參加了乙個python的活動,其間老董的講座是討論網頁爬蟲技術的。其中提到了一下關於頁面解析的問題,他推薦了三種技術。其中有用到libxml2裡的xpath來處理,我就跟令狐談到我曾經也用過這個東東。令狐建議我把這個東東說一下,於是我就寫了這一篇。慚 愧的是我最初在python裡用xpath時...

使用 XPath 解析 HTML 文件

原文 使用xpath解析html文件 xpath 的全稱是 xml path language,即 xml 路徑語言,它是一種在結構化文件 比如 xml 和 html 文件 中定位資訊的語言,關於 xpath 的介紹可以參考 後面我們將以下面的 html 文件介紹 xpath 的使用。下表是 xpa...