Xpath與lxml庫

處理HTML文檔很累当辐,有沒有其他的方法较鼓?

有鸠按!那就是XPath礼搁,我們可以先將 HTML文件 轉(zhuǎn)換成 XML文檔,然后用 XPath語法 查找 HTML 節(jié)點或元素目尖。

劃重點------爬蟲獲取到的response 要先轉(zhuǎn)xml 才能用Xpath解析!!!

什么是XML?

  • XML 指可擴展標記語言(EXtensible Markup Language)
  • XML 是一種標記語言馒吴,很類似 HTML
  • XML 的設(shè)計宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù)
  • XML 的標簽需要我們自行定義。
  • XML 被設(shè)計為具有自我描述性饮戳。
  • XML 是 W3C 的推薦標準

W3School官方文檔:http://www.w3school.com.cn/xml/index.asp

什么是XPath豪治?

XPath (XML Path Language) 是一門在 XML 文檔中查找信息的語言,可用來在 XML 文檔中對元素和屬性進行遍歷扯罐。
W3School官方文檔:http://www.w3school.com.cn/xpath/index.asp

XPath 開發(fā)工具

  1. 開源的XPath表達式編輯工具:XMLQuire(XML格式文件可用)
  2. Chrome插件 XPath Helper
  3. Firefox插件 XPath Checker

lxml庫

lxml 是 一個HTML/XML的解析器负拟,主要的功能是如何解析和提取 HTML/XML 數(shù)據(jù)。

lxml和正則一樣歹河,也是用 C 實現(xiàn)的掩浙,是一款高性能的 Python HTML/XML 解析器,我們可以利用之前學習的XPath語法秸歧,來快速的定位特定元素以及節(jié)點信息厨姚。

lxml python 官方文檔:http://lxml.de/index.html

需要安裝C語言庫,可使用 pip 安裝:pip install lxml

(或通過wheel方式安裝)

初步使用

利用etree.HTML键菱,將字符串解析為HTML文檔

# 使用 lxml 的 etree 庫
from lxml import etree 

#利用etree.HTML谬墙,將字符串解析為HTML文檔
html=etree.HTML(text) 

# 按字符串序列化HTML文檔
result = etree.tostring(html) 
print(result)

lxml 可以自動修正 html 代碼

文件讀取:

除了直接讀取字符串经备,lxml還支持從文件里讀取內(nèi)容拭抬。我們新建一個hello.html文件:

<!-- hello.html -->

<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>

再利用 etree.parse() 方法來讀取文件。

# lxml_parse.py

from lxml import etree

# 讀取外部文件 hello.html
html = etree.parse('./hello.html')
result = etree.tostring(html, pretty_print=True)

print(result)

XPath實例測試

  1. 獲取所有的 <li> 標簽
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')
print type(html)  # 顯示etree.parse() 返回類型

result = html.xpath('//li')

print result  # 打印<li>標簽的元素集合
print len(result)
print type(result)
print type(result[0])

輸出結(jié)果:

<type 'lxml.etree._ElementTree'>
[<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>]
5
<type 'list'>
<type 'lxml.etree._Element'>
  1. 繼續(xù)獲取<li> 標簽的所有 class屬性
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li/@class')

print result

運行結(jié)果

['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
  1. 繼續(xù)獲取<li>標簽下hre 為 link1.html 的 <a> 標簽
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li/a[@href="link1.html"]')

print result

運行結(jié)果

[<Element a at 0x10ffaae18>]
  1. 獲取<li> 標簽下的所有 <span> 標簽
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')

#result = html.xpath('//li/span')
#注意這么寫是不對的:
#因為 / 是用來獲取子元素的侵蒙,而 <span> 并不是 <li> 的子元素造虎,所以,要用雙斜杠

result = html.xpath('//li//span')

print result

運行結(jié)果

[<Element span at 0x10d698e18>]
  1. 獲取 <li> 標簽下的<a>標簽里的所有 class
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li/a//@class')

print result

運行結(jié)果

['blod']
  1. 獲取最后一個 <li> 的 <a> 的 href
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()]/a/@href')
# 謂語 [last()] 可以找到最后一個元素

print result

運行結(jié)果

['link5.html']
  1. 獲取倒數(shù)第二個元素的內(nèi)容
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')
result = html.xpath('//li[last()-1]/a')

# text 方法可以獲取元素內(nèi)容
print result[0].text

運行結(jié)果

fourth item
  1. 獲取 class 值為 bold 的標簽名
# xpath_li.py

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//*[@class="bold"]')

# tag方法可以獲取標簽名
print result[0].tag

運行結(jié)果

span
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纷闺,一起剝皮案震驚了整個濱河市累奈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌急但,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搞乏,死亡現(xiàn)場離奇詭異波桩,居然都是意外死亡,警方通過查閱死者的電腦和手機请敦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門镐躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侍筛,你說我怎么就攤上這事萤皂。” “怎么了匣椰?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵裆熙,是天一觀的道長。 經(jīng)常有香客問我,道長入录,這世上最難降的妖魔是什么蛤奥? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮僚稿,結(jié)果婚禮上凡桥,老公的妹妹穿的比我還像新娘。我一直安慰自己蚀同,他們只是感情好缅刽,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蠢络,像睡著了一般衰猛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谢肾,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天腕侄,我揣著相機與錄音,去河邊找鬼芦疏。 笑死冕杠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的酸茴。 我是一名探鬼主播分预,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薪捍!你這毒婦竟也來了笼痹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤酪穿,失蹤者是張志新(化名)和其女友劉穎凳干,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被济,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡救赐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了只磷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片经磅。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钮追,靈堂內(nèi)的尸體忽然破棺而出预厌,到底是詐尸還是另有隱情,我是刑警寧澤元媚,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布轧叽,位于F島的核電站苗沧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏犹芹。R本人自食惡果不足惜崎页,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腰埂。 院中可真熱鬧飒焦,春花似錦、人聲如沸屿笼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驴一。三九已至休雌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肝断,已是汗流浹背杈曲。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胸懈,地道東北人担扑。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像趣钱,于是被迫代替她去往敵國和親涌献。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前面的文章首有,我們已經(jīng)學會正則表達式以及 BeautifulSoup庫的用法燕垃。我們領(lǐng)教了正則表達式的便捷,感受 be...
    猴哥愛讀書閱讀 1,716評論 1 20
  • Python學習指南 有同學說井联,我正則用的不好卜壕,處理HTML文檔很累,有沒有其他的方法烙常?有印叁!那就是XPath,我們...
    小七奇奇閱讀 1,059評論 0 4
  • ···lxml用法源自 lxml python 官方文檔,更多內(nèi)容請直接參閱官方文檔军掂,本文對其進行翻譯與整理。lx...
    小豐豐_72a2閱讀 943評論 0 1
  • 端午才過去不久昨悼,回廣州時特意帶了些粽子蝗锥,自家的糯米,自己的手工率触,雖然內(nèi)涵并不十分豐富终议,但獨有一番味道。 特意拍了些...
    引木閱讀 167評論 0 1
  • 嘟嘟媽親子閱讀打卡第293天 英語啟蒙:多納的《this little pig》细燎!每天晚上看一集多納,很多時候小家...
    霍嘟嘟媽媽閱讀 200評論 0 0