欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中利用xpath解析HTML的方法

 更新時間:2018年05月14日 14:01:49   作者:whgiser  
本篇文章主要介紹了Python中利用xpath解析HTML的方法,利用其lxml.html的xpath對html進行分析,獲取抓取信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在進行網(wǎng)頁抓取的時候,分析定位html節(jié)點是獲取抓取信息的關(guān)鍵,目前我用的是lxml模塊(用來分析XML文檔結(jié)構(gòu)的,當然也能分析html結(jié)構(gòu)), 利用其lxml.html的xpath對html進行分析,獲取抓取信息。

首先,我們需要安裝一個支持xpath的python庫。目前在libxml2的網(wǎng)站上被推薦的python binding是lxml,也有beautifulsoup,不嫌麻煩的話還可以自己用正則表達式去構(gòu)建,本文以lxml為例講解。

假設(shè)有如下的HTML文檔:

<html>
 <body>
  <form>
   <div id='leftmenu'>
    <h3>text</h3>
    <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這個解析函數(shù),現(xiàn)在我們可以直接對HTML使用xpath了,是不是有點小激動,現(xiàn)在就嘗試下吧。

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

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

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

具體到此處是:

復(fù)制代碼 代碼如下:
$("#leftmenu").children("h3:contains('text')").next("ul").each(function(){...});

找到id為leftmenu的節(jié)點,在其下找到一個內(nèi)容包含為”text”的h3節(jié)點,再取其接下來的一個ul節(jié)點。

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

block_pattern=re.compile(u"<h3>檔案</h3>(.*?)<h3>", 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']")

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

復(fù)制代碼 代碼如下:
nodes=tree.xpath(u"/html/body/form/div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")

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

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

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

如果ul節(jié)點下面還有其他的節(jié)點,我們要找到更深節(jié)點的內(nèi)容,如下的循環(huán)就是把這些節(jié)點的文本內(nèi)容列出:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決安裝新版PyQt5、PyQT5-tool后打不開并Designer.exe提示no Qt platform plugin的問題

    解決安裝新版PyQt5、PyQT5-tool后打不開并Designer.exe提示no Qt platform plug

    這篇文章主要介紹了解決安裝新版PyQt5、PyQT5-tool后打不開并Designer.exe提示no Qt platform plugin的問題,需要的朋友可以參考下
    2020-04-04
  • Python+OpenGL制作一個元宵花燈

    Python+OpenGL制作一個元宵花燈

    又是一年元宵節(jié)!如果昨天情人節(jié)的紅包發(fā)得手軟又心疼,不妨利用Python OpenGL做一盞花燈送給女朋友,也許比紅包更能討她歡心呢
    2022-02-02
  • Python實現(xiàn)字符串模糊匹配方式

    Python實現(xiàn)字符串模糊匹配方式

    這篇文章主要介紹了Python實現(xiàn)字符串模糊匹配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 關(guān)于PySnooper 永遠不要使用print進行調(diào)試的問題

    關(guān)于PySnooper 永遠不要使用print進行調(diào)試的問題

    這篇文章主要介紹了關(guān)于PySnooper 永遠不要使用print進行調(diào)試的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 玩轉(zhuǎn)Python發(fā)短信的實現(xiàn)

    玩轉(zhuǎn)Python發(fā)短信的實現(xiàn)

    用Python實現(xiàn)發(fā)短信功能,當監(jiān)控到問題出現(xiàn)時,短信報警,使問題能得到及時的處理。當然,我相信,用Python發(fā)短信應(yīng)用場景不止此一處,下面我們開始Python發(fā)短信的實現(xiàn),感興趣的朋友參考下吧
    2022-01-01
  • 利用Python求陰影部分的面積實例代碼

    利用Python求陰影部分的面積實例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python求陰影部分面積的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • 介紹Python的@property裝飾器的用法

    介紹Python的@property裝飾器的用法

    這篇文章主要介紹了介紹Python的@property裝飾器的用法,是Python學習進階中的重要知識,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • 分析機器學習之決策樹Python實現(xiàn)

    分析機器學習之決策樹Python實現(xiàn)

    決策樹是一種非參數(shù)的有監(jiān)督學習方法,它能夠從一系列有特征和標簽的數(shù)據(jù)中總結(jié)出決策規(guī)則,并用樹狀圖的結(jié)構(gòu)來呈現(xiàn)這些規(guī)則,以解決分類和回歸問題。決策樹算法容易理解,適用各種數(shù)據(jù),在解決各種問題時都有良好表現(xiàn)
    2021-06-06
  • 使用Python和Plotly繪制各種類型3D圖形的方法

    使用Python和Plotly繪制各種類型3D圖形的方法

    Python語言擁有豐富的數(shù)據(jù)可視化庫,其中Plotly是一款流行的工具,提供了繪制高質(zhì)量三維圖形的功能,本文將介紹如何使用Python和Plotly來繪制各種類型的3D圖形,并給出代碼實例,需要的朋友可以參考下
    2024-05-05
  • python關(guān)閉print輸出信息詳情

    python關(guān)閉print輸出信息詳情

    這篇文章主要介紹了python關(guān)閉print輸出信息詳情,當我們遇到需要關(guān)閉print輸出信息的情況,我們可以通過控制sys.stdout來實現(xiàn)print輸出的開關(guān),下面文章就用一個簡單的例子來實現(xiàn),需要的小伙伴可以參考一下
    2022-02-02

最新評論