最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲指南之xpath實(shí)例解析(附實(shí)戰(zhàn))

 更新時(shí)間:2022年01月29日 09:12:55   作者:李富貴要上岸985  
在進(jìn)行網(wǎng)頁(yè)抓取的時(shí)候,分析定位html節(jié)點(diǎn)是獲取抓取信息的關(guān)鍵,目前我用的是lxml模塊,下面這篇文章主要給大家介紹了關(guān)于python爬蟲指南之xpath實(shí)例解析的相關(guān)資料,需要的朋友可以參考下

前言

XPath,全稱XML Path Language,即XML路徑語(yǔ)言,它是一門在XML文檔中查找信息的語(yǔ)言,它最初是用來(lái)搜尋XML文檔的,但是它同樣適用于HTML文檔的搜索

XPath的選擇功能十分強(qiáng)大,它提供了非常簡(jiǎn)明的路徑選擇表達(dá)式,另外,它還提供了超過(guò)100個(gè)內(nèi)建函數(shù),用于字符串、數(shù)值、時(shí)間的匹配以及節(jié)點(diǎn)、序列的處理等,幾乎所有我們想要定位的節(jié)點(diǎn),都可以用XPath來(lái)選擇

xpath解析原理:

1.實(shí)現(xiàn)標(biāo)簽的定位:實(shí)例化一個(gè)etree的對(duì)象,且需要將被解析的頁(yè)面源碼數(shù)據(jù)加載到該對(duì)象中。

2.調(diào)用etree對(duì)象中的xpath方法結(jié)合著xpath表達(dá)式實(shí)現(xiàn)標(biāo)簽的定位和內(nèi)容的捕獲。

環(huán)境的安裝

pip install lxml

lxml是python的一個(gè)解析庫(kù),支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高

如何實(shí)例化一個(gè)etree對(duì)象

1.將本地的html文檔中的源碼數(shù)據(jù)加載到etree對(duì)象中:

etree. parse(filePath)#你的文件路徑

2.可以將從互聯(lián)網(wǎng)上獲取的源碼數(shù)據(jù)加載到該對(duì)象中

etree.HtML('page_ text')#page_ text互聯(lián)網(wǎng)中響應(yīng)的數(shù)據(jù)

xpath 表達(dá)式

表達(dá)式描述
nodename選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)
/表示的是從根節(jié)點(diǎn)開始定位。表示的是一個(gè)層級(jí)。
//表示的是多個(gè)層級(jí)??梢员硎緩娜我馕恢瞄_始定位。
.選取當(dāng)前節(jié)點(diǎn)
選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
@選取屬性
*通配符,選擇所有元素節(jié)點(diǎn)與元素名
@*選取所有屬性
[@attrib]選取具有給定屬性的所有元素
[@attrib=‘value’]選取給定屬性具有給定值的所有元素
[tag]選取所有具有指定元素的直接子節(jié)點(diǎn)
[tag=‘text’]選取所有具有指定元素并且文本內(nèi)容是text節(jié)點(diǎn)

對(duì)上面表達(dá)式的實(shí)例詳解

這是一個(gè)HTML的文檔

<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>測(cè)試bs4</title>
</head>
<body>
	<div>
		<p>百里守約</p>
	</div>
	<div class="song">
		<p>李清照</p>
		<p>王安石</p>
		<p>蘇軾</p>
		<p>柳宗元</p>
		<a  title="趙匡胤" target="_self">
			<span>this is span</span>
		宋朝是最強(qiáng)大的王朝,不是軍隊(duì)的強(qiáng)大,而是經(jīng)濟(jì)很強(qiáng)大,國(guó)民都很有錢</a>
		<a href="" class="du">總為浮云能蔽日,長(zhǎng)安不見使人愁</a>
		<img src="http://www.baidu.com/meinv.jpg" alt="" />
	</div>
	<div class="tang">
		<ul>
			<li><a  title="qing">清明時(shí)節(jié)雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村</a></li>
			<li><a  title="qin">秦時(shí)明月漢時(shí)關(guān),萬(wàn)里長(zhǎng)征人未還,但使龍城飛將在,不教胡馬度陰山</a></li>
			<li><a  alt="qi">岐王宅里尋常見,崔九堂前幾度聞,正是江南好風(fēng)景,落花時(shí)節(jié)又逢君</a></li>
			<li><a  class="du">杜甫</a></li>
			<li><a  class="du">杜牧</a></li>
			<li><b>杜小月</b></li>
			<li><i>度蜜月</i></li>
			<li><a  id="feng">鳳凰臺(tái)上鳳凰游,鳳去臺(tái)空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a></li>
		</ul>
	</div>
</body>
</html>

從瀏覽器中打開是這樣的

為了方便直觀,我們對(duì)寫個(gè)HTML文件進(jìn)行本地讀取進(jìn)行測(cè)試

子節(jié)點(diǎn)和子孫節(jié)點(diǎn)的定位 / 和 //

先來(lái)看子節(jié)點(diǎn)和子孫節(jié)點(diǎn),我們從上往下找div這個(gè)節(jié)點(diǎn),可以看到div的父節(jié)點(diǎn)是body,body父節(jié)點(diǎn)是html

定位到這個(gè)HTML的div對(duì)象中,看上面html源碼,可以知道有三個(gè)div對(duì)象

我們通過(guò)三種不同的方法來(lái)輸出這個(gè)節(jié)點(diǎn)的信息,可以看到輸出的是三個(gè)一樣的Element,也就是這三種方法實(shí)現(xiàn)的功能是一樣的。

import requests
from lxml import etree
tree = etree.parse('test.html')
r1=tree.xpath('/html/body/div')	#直接從上往下挨著找節(jié)點(diǎn)
r2=tree.xpath('/html//div')#跳躍了一個(gè)節(jié)點(diǎn)來(lái)找到這個(gè)div節(jié)點(diǎn)的對(duì)象
r3=tree.xpath('//div')##跳躍上面所有節(jié)點(diǎn)來(lái)尋找div節(jié)點(diǎn)的對(duì)象
r1,r2,r3

>>
([<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>],
  
 [<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>],
  
 [<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>])

屬性定位

如果我只想要div里面song這一個(gè)標(biāo)簽,就可以對(duì)其屬性定位

當(dāng)然返回的還是一個(gè)element

r4=tree.xpath('//div[@class="song"]')
r4

>>
>[<Element div at 0x19d447658c8>]

索引定位

如果我只想獲得song里面的蘇軾的這個(gè)標(biāo)簽

我們找到了song,/p可以返回里面的所有標(biāo)簽,

tree.xpath('//div[@class="song"]/p')
>>
[<Element p at 0x19d4469a648>,
 <Element p at 0x19d4469a4c8>,
 <Element p at 0x19d4469af88>,
 <Element p at 0x19d4469a148>]

這個(gè)單獨(dú)返回的蘇軾的p標(biāo)簽,要注意的是這里的索引不是從0開始的,而是1

tree.xpath('//div[@class="song"]/p[3]')
[<Element p at 0x19d4469af88>]

取文本

比如我想取杜牧這個(gè)文本內(nèi)容

和上面一樣,我們要定位到杜牧的這個(gè)a標(biāo)簽,首先要找到他的上一級(jí) li ,這是第五個(gè) li 里面的a所以就有了下面的寫法,text()是把element轉(zhuǎn)化為文本,當(dāng)然上面的在后面加個(gè)text()都可以展示文本內(nèi)容。

tree.xpath('//div[@class="tang"]//li[5]/a/text()')

>>
['杜牧']

可以看到這個(gè)返回的是一個(gè)列表,如果我們想取里面的字符串,可以這樣

tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]

杜牧

看一個(gè)更直接的,//li 直接定位到 li這個(gè)標(biāo)簽,//text()直接將這個(gè)標(biāo)簽下的文本提取出來(lái)。但要注意,這樣會(huì)把所有的li標(biāo)簽下面的文本提取出來(lái),有時(shí)候你并不想要的文本也會(huì)提取出來(lái),所以最好還是寫詳細(xì)一點(diǎn),如具體到哪個(gè)div里的li。

tree.xpath('//li//text()')

['清明時(shí)節(jié)雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村',
 '秦時(shí)明月漢時(shí)關(guān),萬(wàn)里長(zhǎng)征人未還,但使龍城飛將在,不教胡馬度陰山',
 '岐王宅里尋常見,崔九堂前幾度聞,正是江南好風(fēng)景,落花時(shí)節(jié)又逢君',
 '杜甫',
 '杜牧',
 '杜小月',
 '度蜜月',
 '鳳凰臺(tái)上鳳凰游,鳳去臺(tái)空江自流,吳宮花草埋幽徑,晉代衣冠成古丘']

取屬性

比如我想取下面這個(gè)屬性

可以直接用@取屬性

tree.xpath('//div[@class="song"]/img/@src')

['http://www.baidu.com/meinv.jpg']

或者如果我想取所有的href這個(gè)屬性,可以看到tang和song的所有href屬性

tree.xpath('//@href')

['http://www.song.com/',
 '',
 'http://www.baidu.com',
 'http://www.163.com',
 'http://www.126.com',
 'http://www.sina.com',
 'http://www.dudu.com',
 'http://www.haha.com']

爬蟲實(shí)戰(zhàn)之58同城房源信息

#導(dǎo)入必要的庫(kù)
import requests
from lxml import etree
#URL就是網(wǎng)址,headers看圖一
url='https://sh.58.com/ershoufang/'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.7 Safari/537.36'}
#對(duì)網(wǎng)站發(fā)起請(qǐng)求
page_test=requests.get(url=url,headers=headers).text
# 這里是將從互聯(lián)網(wǎng)上獲取的源碼數(shù)據(jù)加載到該對(duì)象中
tree=etree.HTML(page_test)
#先看圖二的解釋,這里li有多個(gè),所里返回的li_list是一個(gè)列表
li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')
#這里我們打開一個(gè)58.txt文件來(lái)保存我們的信息
fp=open('58.txt','w',encoding='utf-8')
#li遍歷li_list
for li in li_list:
	#這里 ./是對(duì)前面li的繼承,相當(dāng)于li/div...
    title=li.xpath('./div[2]/h2/a/text()')[0]
    print(title+'\n')
    #把文件寫入文件
    fp.write(title+'\n')
fp.close()

圖一:

圖二:.

這里我們要提取所有的房源信息,可以看到每個(gè)小節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)都是一樣的,我們要提取的是h2節(jié)點(diǎn)a里的房源信息,看圖三

這里每個(gè) /li 節(jié)點(diǎn)里面的子節(jié)點(diǎn)都是一樣的,所以我們可以先找到所有的li節(jié)點(diǎn),再往下找我們想要的信息

總結(jié)

到此這篇關(guān)于python爬蟲指南之xpath實(shí)例解析的文章就介紹到這了,更多相關(guān)python爬蟲之xpath內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyTorch 如何自動(dòng)計(jì)算梯度

    PyTorch 如何自動(dòng)計(jì)算梯度

    這篇文章主要介紹了PyTorch 如何自動(dòng)計(jì)算梯度的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python數(shù)據(jù)抓取分析的示例代碼(python + mongodb)

    python數(shù)據(jù)抓取分析的示例代碼(python + mongodb)

    本篇文章主要介紹了python數(shù)據(jù)抓取分析的示例代碼(python + mongodb),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Python requests庫(kù)輕松發(fā)送HTTP請(qǐng)求的終極指南

    Python requests庫(kù)輕松發(fā)送HTTP請(qǐng)求的終極指南

    在現(xiàn)代網(wǎng)絡(luò)編程中,HTTP請(qǐng)求是與Web服務(wù)交互的基礎(chǔ),本文將全面介紹requests庫(kù)的使用方法,從基礎(chǔ)請(qǐng)求到高級(jí)技巧,幫助你掌握網(wǎng)絡(luò)數(shù)據(jù)交互的核心技能
    2025-08-08
  • 使用python驗(yàn)證代理ip是否可用的實(shí)現(xiàn)方法

    使用python驗(yàn)證代理ip是否可用的實(shí)現(xiàn)方法

    驗(yàn)證代理IP是否可用。原理是使用代理IP訪問指定網(wǎng)站,如果返回狀態(tài)為200,表示這個(gè)代理是可以使用的。這篇文章重點(diǎn)給大家介紹使用python驗(yàn)證代理ip是否可用的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧
    2018-07-07
  • django中模板的html自動(dòng)轉(zhuǎn)意方法

    django中模板的html自動(dòng)轉(zhuǎn)意方法

    今天小編就為大家分享一篇django中模板的html自動(dòng)轉(zhuǎn)意方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python解決報(bào)錯(cuò)ImportError: Bad git executable.問題

    python解決報(bào)錯(cuò)ImportError: Bad git executable.問題

    這篇文章主要介紹了python解決報(bào)錯(cuò)ImportError: Bad git executable.問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 手把手教你搭建python+selenium自動(dòng)化環(huán)境(圖文)

    手把手教你搭建python+selenium自動(dòng)化環(huán)境(圖文)

    本文主要介紹了手把手教你搭建python+selenium自動(dòng)化環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • python將特殊不可見字符Unicode編碼轉(zhuǎn)換成可見字符串

    python將特殊不可見字符Unicode編碼轉(zhuǎn)換成可見字符串

    這篇文章主要為大家詳細(xì)介紹了python如何將特殊不可見字符Unicode編碼轉(zhuǎn)換成可見字符串,文中的示例代碼講解詳細(xì),感興趣的小伙伴利用了解下
    2025-05-05
  • 如何基于Python pygame實(shí)現(xiàn)動(dòng)畫跑馬燈

    如何基于Python pygame實(shí)現(xiàn)動(dòng)畫跑馬燈

    這篇文章主要介紹了如何基于Python pygame實(shí)現(xiàn)動(dòng)畫跑馬燈,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python獲取一組漢字拼音首字母的方法

    python獲取一組漢字拼音首字母的方法

    這篇文章主要介紹了python獲取一組漢字拼音首字母的方法,涉及Python針對(duì)漢字操作的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

锦州市| 威远县| 罗源县| 潢川县| 林口县| 隆子县| 封丘县| 定结县| 杭锦旗| 保康县| 连州市| 元朗区| 高安市| 黎平县| 河南省| 通城县| 绵阳市| 西安市| 改则县| 称多县| 和龙市| 宣恩县| 舞阳县| 郴州市| 万年县| 佛山市| 泰安市| 卫辉市| 望奎县| 容城县| 乐都县| 同仁县| 茌平县| 修水县| 博客| 游戏| 都匀市| 青岛市| 甘德县| 应城市| 永靖县|