python爬蟲(chóng)之xpath的基本使用

一、簡(jiǎn)介

  XPath 是一門(mén)在 XML 文檔中查找信息的語(yǔ)言。XPath 可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷缺脉。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素短荐,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上。

參照

二细睡、安裝

1pip3 install lxml

三谷羞、使用

  1、導(dǎo)入

1from?lxml?import?etree

  2溜徙、基本使用

from?lxml?import?etree

wb_data?=?"""

????????"""

html?=?etree.HTML(wb_data)

print(html)

result?=?etree.tostring(html)

print(result.decode("utf-8"))

l?import?etree

wb_data?=?"""

????????"""

html?=?etree.HTML(wb_data)

print(html)

result?=?etree.tostring(html)

print(result.decode("utf-8"))

  從下面的結(jié)果來(lái)看湃缎,我們打印機(jī)html其實(shí)就是一個(gè)python對(duì)象,etree.tostring(html)則是不全里html的基本寫(xiě)法蠢壹,補(bǔ)全了缺胳膊少腿的標(biāo)簽嗓违。

  3、獲取某個(gè)標(biāo)簽的內(nèi)容(基本使用)图贸,注意蹂季,獲取a標(biāo)簽的所有內(nèi)容,a后面就不用再加正斜杠疏日,否則報(bào)錯(cuò)偿洁。

  寫(xiě)法一

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('/html/body/div/ul/li/a')

print(html)

for?i?in?html_data:

????print(i.text)

  寫(xiě)法二(直接在需要查找內(nèi)容的標(biāo)簽后面加一個(gè)/text()就行)

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('/html/body/div/ul/li/a/text()')

print(html)

for?i?in?html_data:

????print(i)

first item

second item

third item

fourth item

fifth item

  4、打開(kāi)讀取html文件

#使用parse打開(kāi)html的文件

html?=?etree.parse('test.html')

html_data?=?html.xpath('//*')
#打印是一個(gè)列表沟优,需要遍歷

print(html_data)

for?i?in?html_data:

????print(i.text)

html?=?etree.parse('test.html')

html_data?=?etree.tostring(html,pretty_print=True)

res?=?html_data.decode('utf-8')

print(res)


  5涕滋、打印指定路徑下a標(biāo)簽的屬性(可以通過(guò)遍歷拿到某個(gè)屬性的值,查找標(biāo)簽的內(nèi)容)

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('/html/body/div/ul/li/a/@href')

for?i?in?html_data:

????print(i)


打幽痈蟆:

link1.html

link2.html

link3.html

link4.html

link5.html

  6宾肺、我們知道我們使用xpath拿到得都是一個(gè)個(gè)的ElementTree對(duì)象溯饵,所以如果需要查找內(nèi)容的話,還需要遍歷拿到數(shù)據(jù)的列表锨用。

  查到絕對(duì)路徑下a標(biāo)簽屬性等于link2.html的內(nèi)容丰刊。

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()')

print(html_data)

for?i?in?html_data:

????print(i)

打印:

['second item']

second item

  7增拥、上面我們找到全部都是絕對(duì)路徑(每一個(gè)都是從根開(kāi)始查找)啄巧,下面我們查找相對(duì)路徑,例如跪者,查找所有l(wèi)i標(biāo)簽下的a標(biāo)簽內(nèi)容棵帽。

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('//li/a/text()')

print(html_data)

for?i?in?html_data:

????print(i)


打印:

['first item',?'second item',?'third item',?'fourth item',?'fifth item']

first item

second item

third item

fourth item

fifth item

  8渣玲、上面我們使用絕對(duì)路徑逗概,查找了所有a標(biāo)簽的屬性等于href屬性值,利用的是/---絕對(duì)路徑忘衍,下面我們使用相對(duì)路徑逾苫,查找一下l相對(duì)路徑下li標(biāo)簽下的a標(biāo)簽下的href屬性的值,注意枚钓,a標(biāo)簽后面需要雙//铅搓。

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('//li/a//@href')

print(html_data)

for?i?in?html_data:

????print(i)


打印:

['link1.html',?'link2.html',?'link3.html',?'link4.html',?'link5.html']

link1.html

link2.html

link3.html

link4.html

link5.html

  9搀捷、相對(duì)路徑下跟絕對(duì)路徑下查特定屬性的方法類(lèi)似星掰,也可以說(shuō)相同。

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('//li/a[@href="link2.html"]')

print(html_data)

for?i?in?html_data:

????print(i.text)


打幽壑邸:

[]

second item

  10氢烘、查找最后一個(gè)li標(biāo)簽里的a標(biāo)簽的href屬性

html?=?etree.HTML(wb_data)

html_data?=?html.xpath('//li[last()]/a/text()')

print(html_data)

for?i?in?html_data:

????print(i)


打印:

['fifth item']

fifth item

  11家厌、查找倒數(shù)第二個(gè)li標(biāo)簽里的a標(biāo)簽的href屬性


html?=?etree.HTML(wb_data)

html_data?=?html.xpath('//li[last()-1]/a/text()')

print(html_data)

for?i?in?html_data:

????print(i)


打硬ゾ痢:

['fourth item']

fourth item

  12、如果在提取某個(gè)頁(yè)面的某個(gè)標(biāo)簽的xpath路徑的話饭于,可以如下圖:

  //*[@id="kw"]?

  解釋:使用相對(duì)路徑查找所有的標(biāo)簽蜀踏,屬性id等于kw的標(biāo)簽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掰吕,一起剝皮案震驚了整個(gè)濱河市果覆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殖熟,老刑警劉巖随静,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡燎猛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)照皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)重绷,“玉大人,你說(shuō)我怎么就攤上這事膜毁≌炎浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵瘟滨,是天一觀的道長(zhǎng)候醒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)杂瘸,這世上最難降的妖魔是什么倒淫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮败玉,結(jié)果婚禮上敌土,老公的妹妹穿的比我還像新娘。我一直安慰自己运翼,他們只是感情好返干,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著血淌,像睡著了一般矩欠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悠夯,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天癌淮,我揣著相機(jī)與錄音,去河邊找鬼疗疟。 笑死该默,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的策彤。 我是一名探鬼主播栓袖,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼店诗!你這毒婦竟也來(lái)了裹刮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庞瘸,失蹤者是張志新(化名)和其女友劉穎捧弃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡违霞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年嘴办,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片买鸽。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涧郊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眼五,到底是詐尸還是另有隱情妆艘,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布看幼,位于F島的核電站批旺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诵姜。R本人自食惡果不足惜汽煮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茅诱。 院中可真熱鬧逗物,春花似錦、人聲如沸瑟俭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摆寄。三九已至失暴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間微饥,已是汗流浹背逗扒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欠橘,地道東北人矩肩。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肃续,于是被迫代替她去往敵國(guó)和親黍檩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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