經過一番研究以後才發現原來libxml2其實已經內建了對html的解析——即使是不很規範的html。所以上篇《xpath在xhtml解析中的應用 》完全是我學藝不精的產物。囧
不過好處是順便學習到了j7a7c7k7 兄推薦的tidy(用的是令狐提供的µtidylib ),這也是個好東東。
現在來看如何直接使用lxml(即前文說過的libxml2的乙個python binding)處理那個樣本「頁面 」:
import codecsbingo!果然成功。關鍵就在於etree提供了html這個解析函式。之後的事情就好辦多了,因為可以直接對html使用xpath。from lxml import etree
f=codecs.open("raptor.htm","r","utf-8")
content=f.read()
f.close()
tree=etree.html(content)
不過這個樣本頁面中要解析的部分有乙個問題就是:那個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")這段的意思是取得這個ul節點下的所有節點。之後的迴圈就是把這些節點的文字內容列出。for n in nodes:
print n.text
我只能說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...