国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中利用xpath解析HTML的方法

2020-02-23 00:07:23
字體:
來源:轉載
供稿:網友

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

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

假設有如下的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這個解析函數,現在我們可以直接對HTML使用xpath了,是不是有點小激動,現在就嘗試下吧。

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

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

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

具體到此處是:

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

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

在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']")

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

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大埔区| 普格县| 清徐县| 龙川县| 彭州市| 湘潭县| 民丰县| 龙山县| 灵武市| 抚远县| 石景山区| 宝丰县| 比如县| 绥江县| 锦屏县| 齐河县| 昌乐县| 大化| 钦州市| 东平县| 阳城县| 武夷山市| 木兰县| 澄迈县| 盐亭县| 鄂温| 双辽市| 尼木县| 凤山市| 通州区| 萨迦县| 奉节县| 察隅县| 神农架林区| 郸城县| 西和县| 耿马| 长海县| 全南县| 长海县| 牡丹江市|