這篇文章主要介紹“python爬蟲中xpath實例分析”,在日常操作中,相信很多人在python爬蟲中xpath實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python爬蟲中xpath實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,它最初是用來搜尋XML文檔的,但是它同樣適用于HTML文檔的搜索
XPath的選擇功能十分強大,它提供了非常簡明的路徑選擇表達式,另外,它還提供了超過100個內建函數,用于字符串、數值、時間的匹配以及節點、序列的處理等,幾乎所有我們想要定位的節點,都可以用XPath來選擇
xpath解析原理:
1.實現標簽的定位:實例化一個etree的對象,且需要將被解析的頁面源碼數據加載到該對象中。
2.調用etree對象中的xpath方法結合著xpath表達式實現標簽的定位和內容的捕獲。
pip install lxml
lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高
如何實例化一個etree對象
1.將本地的html文檔中的源碼數據加載到etree對象中:
etree. parse(filePath)#你的文件路徑
2.可以將從互聯網上獲取的源碼數據加載到該對象中
etree.HtML('page_ text')#page_ text互聯網中響應的數據xpath 表達式
| 表達式 | 描述 |
|---|---|
| nodename | 選取此節點的所有子節點 |
| / | 表示的是從根節點開始定位。表示的是一個層級。 |
| // | 表示的是多個層級??梢员硎緩娜我馕恢瞄_始定位。 |
| . | 選取當前節點 |
| … | 選取當前節點的父節點 |
| @ | 選取屬性 |
| * | 通配符,選擇所有元素節點與元素名 |
| @* | 選取所有屬性 |
| [@attrib] | 選取具有給定屬性的所有元素 |
| [@attrib=‘value’] | 選取給定屬性具有給定值的所有元素 |
| [tag] | 選取所有具有指定元素的直接子節點 |
| [tag=‘text’] | 選取所有具有指定元素并且文本內容是text節點 |
對上面表達式的實例詳解
這是一個HTML的文檔
<html lang="en"> <head> <meta charset="UTF-8" /> <title>測試bs4</title> </head> <body> <div> <p>百里守約</p> </div> <div class="song"> <p>李清照</p> <p>王安石</p> <p>蘇軾</p> <p>柳宗元</p> <a href="http://www.song.com/" title="趙匡胤" target="_self"> <span>this is span</span> 宋朝是最強大的王朝,不是軍隊的強大,而是經濟很強大,國民都很有錢</a> <a href="" class="du">總為浮云能蔽日,長安不見使人愁</a> <img src="http://www.baidu.com/meinv.jpg" alt="" /> </div> <div class="tang"> <ul> <li><a href="http://www.baidu.com" title="qing">清明時節雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村</a></li> <li><a href="http://www.163.com" title="qin">秦時明月漢時關,萬里長征人未還,但使龍城飛將在,不教胡馬度陰山</a></li> <li><a href="http://www.126.com" alt="qi">岐王宅里尋常見,崔九堂前幾度聞,正是江南好風景,落花時節又逢君</a></li> <li><a href="http://www.sina.com" class="du">杜甫</a></li> <li><a href="http://www.dudu.com" class="du">杜牧</a></li> <li><b>杜小月</b></li> <li><i>度蜜月</i></li> <li><a href="http://www.haha.com" id="feng">鳳凰臺上鳳凰游,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a></li> </ul> </div> </body> </html>
從瀏覽器中打開是這樣的

為了方便直觀,我們對寫個HTML文件進行本地讀取進行測試
子節點和子孫節點的定位 / 和 //
先來看子節點和子孫節點,我們從上往下找div這個節點,可以看到div的父節點是body,body父節點是html

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



我們通過三種不同的方法來輸出這個節點的信息,可以看到輸出的是三個一樣的Element,也就是這三種方法實現的功能是一樣的。
import requests
from lxml import etree
tree = etree.parse('test.html')
r1=tree.xpath('/html/body/div') #直接從上往下挨著找節點
r2=tree.xpath('/html//div')#跳躍了一個節點來找到這個div節點的對象
r3=tree.xpath('//div')##跳躍上面所有節點來尋找div節點的對象
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這一個標簽,就可以對其屬性定位

當然返回的還是一個element
r4=tree.xpath('//div[@class="song"]')
r4
>>
>[<Element div at 0x19d447658c8>]如果我只想獲得song里面的蘇軾的這個標簽
我們找到了song,/p可以返回里面的所有標簽,
tree.xpath('//div[@class="song"]/p')
>>
[<Element p at 0x19d4469a648>,
<Element p at 0x19d4469a4c8>,
<Element p at 0x19d4469af88>,
<Element p at 0x19d4469a148>]這個單獨返回的蘇軾的p標簽,要注意的是這里的索引不是從0開始的,而是1
tree.xpath('//div[@class="song"]/p[3]')
[<Element p at 0x19d4469af88>]比如我想取杜牧這個文本內容

和上面一樣,我們要定位到杜牧的這個a標簽,首先要找到他的上一級 li ,這是第五個 li 里面的a所以就有了下面的寫法,text()是把element轉化為文本,當然上面的在后面加個text()都可以展示文本內容。
tree.xpath('//div[@class="tang"]//li[5]/a/text()')
>>
['杜牧']可以看到這個返回的是一個列表,如果我們想取里面的字符串,可以這樣
tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]
杜牧看一個更直接的,//li 直接定位到 li這個標簽,//text()直接將這個標簽下的文本提取出來。但要注意,這樣會把所有的li標簽下面的文本提取出來,有時候你并不想要的文本也會提取出來,所以最好還是寫詳細一點,如具體到哪個div里的li。
tree.xpath('//li//text()')
['清明時節雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村',
'秦時明月漢時關,萬里長征人未還,但使龍城飛將在,不教胡馬度陰山',
'岐王宅里尋常見,崔九堂前幾度聞,正是江南好風景,落花時節又逢君',
'杜甫',
'杜牧',
'杜小月',
'度蜜月',
'鳳凰臺上鳳凰游,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘']比如我想取下面這個屬性

可以直接用@取屬性
tree.xpath('//div[@class="song"]/img/@src')
['http://www.baidu.com/meinv.jpg']或者如果我想取所有的href這個屬性,可以看到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']爬蟲實戰之58同城房源信息
#導入必要的庫
import requests
from lxml import etree
#URL就是網址,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'}
#對網站發起請求
page_test=requests.get(url=url,headers=headers).text
# 這里是將從互聯網上獲取的源碼數據加載到該對象中
tree=etree.HTML(page_test)
#先看圖二的解釋,這里li有多個,所里返回的li_list是一個列表
li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')
#這里我們打開一個58.txt文件來保存我們的信息
fp=open('58.txt','w',encoding='utf-8')
#li遍歷li_list
for li in li_list:
#這里 ./是對前面li的繼承,相當于li/div...
title=li.xpath('./div[2]/h3/a/text()')[0]
print(title+'\n')
#把文件寫入文件
fp.write(title+'\n')
fp.close()圖一:

圖二:.
這里我們要提取所有的房源信息,可以看到每個小節點的上一個節點都是一樣的,我們要提取的是h3節點a里的房源信息,看圖三

這里每個 /li 節點里面的子節點都是一樣的,所以我們可以先找到所有的li節點,再往下找我們想要的信息

到此,關于“python爬蟲中xpath實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。