Scrapy元素選擇器Xpath用法匯總
眾所周知,在設(shè)計(jì)爬蟲(chóng)時(shí),最麻煩的一步就是對(duì)網(wǎng)頁(yè)元素進(jìn)行分析,目前流行的網(wǎng)頁(yè)元素獲取的工具有BeautifulSoup,lxml等,而據(jù)我使用的體驗(yàn)而言,Scrapy的元素選擇器Xpath(結(jié)合正則表達(dá)式)是其中較為出色的一種(個(gè)人認(rèn)為最好啦,當(dāng)然只能在Scrapy中使用)功能相對(duì)較全、使用較為方便,正因?yàn)樗呢S富性,有時(shí)很多功能會(huì)忘記,所以在這里整理好記錄下來(lái),方便今后查閱使用。
1. 元素的多級(jí)定位與跳級(jí)定位
多級(jí)定位:依靠html中的多級(jí)元素逐步縮小范圍
response.xpath('//table/tbody/tr/td')
//如果知道元素所屬的下標(biāo)可以用下標(biāo)選擇
response.xpath('//table/tbody/tr[1]/td')
跳級(jí)定位:符號(hào)“//”表示跳級(jí)定位,即對(duì)當(dāng)前元素的所有層數(shù)的子元素(不僅是第一層子元素)進(jìn)行查找,一般xpath的開(kāi)頭都是跳級(jí)定位
response.xpath('//span//table')
2. 依靠元素的屬性定位
每個(gè)html元素都有很多屬性,如id、class、title、href、text(href和text往往可以配合正則表達(dá)式)等,這些屬性往往具有很強(qiáng)的特殊性,結(jié)合元素多級(jí)定位或跳級(jí)定位會(huì)更準(zhǔn)確高效,下面舉幾個(gè)典型的例子,其他的舉一反三
利用class定位
response.xpath('//td[@class="mc_content"]')
利用href配合正則表達(dá)式定位
response.xpath('//a[re:test(@href,"^\/index\.php\?m=News&a=details&id=1&NewsId=\d{1,4}")]')
利用text結(jié)合正則表達(dá)式定位
a=response.xpath('//a[re:test(text(),"\w{4}")]')
此外,xpath還有對(duì)于html元素操作的兩個(gè)實(shí)用的函數(shù)(可以用正則表達(dá)式代替)——starts-with和contains;
a=response.xpath('//a[starts-with(@title,"注冊(cè)時(shí)間")]')
a=response.xpath('//a[contains(text(),"聞")]')
3. 提取元素或元素的屬性值
首先是最基本的extract()函數(shù),提取被定為的元素對(duì)象
a=response.xpath('//a[contains(text(),"聞")]').extract()
//如果被定為的元素對(duì)象有多個(gè),可以有用下標(biāo)指定
a=response.xpath('//a[contains(text(),"聞")]').extract()[1]
提取元素的屬性
//提取text
a=response.xpath('//a[contains(text(),"聞")]/text()').extract()
//獲取href
a=response.xpath('//a[contains(text(),"聞")]/@href').extract()
//獲取name
a=response.xpath('//a[contains(text(),"聞")]/@name').extract()
此時(shí)我們的正則表達(dá)式又閑不住了(scrapy自帶的函數(shù)),可以對(duì)提取的元素進(jìn)行選擇
//對(duì)href中的部分字符串進(jìn)行選擇
response.xpath('//a[@name="_l_p_n"]/@href').re('\/s.*?list\.htm')
在這里關(guān)于xpath的所有用法基本總結(jié)完畢,只是由于xpath是對(duì)靜態(tài)元素進(jìn)行匹配選擇,對(duì)于javascript往往束手無(wú)策,這時(shí)不得不用一個(gè)自動(dòng)化測(cè)試工具——selenium,可以實(shí)現(xiàn)各種動(dòng)態(tài)事件和靜態(tài)元素的選擇,只是selenium往往比較吃?xún)?nèi)存,響應(yīng)時(shí)間也比較慢,對(duì)于大型的爬蟲(chóng)任務(wù)盡量不要使用,畢竟有一些javascript元素是內(nèi)嵌在網(wǎng)頁(yè)代碼中的,這時(shí)候結(jié)合萬(wàn)能的正則表達(dá)式,xpath往往能夠?qū)崿F(xiàn)。如下:
link = re.search("javascript:goToPage\('(.*?)'", value) //value為包含該段的字符串
到此這篇關(guān)于Scrapy元素選擇器Xpath用法匯總的文章就介紹到這了,更多相關(guān)Scrapy元素選擇器Xpath 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python連接MySQL數(shù)據(jù)庫(kù)實(shí)例分析
這篇文章主要介紹了python連接MySQL數(shù)據(jù)庫(kù),實(shí)例分析了Python操作MySQL的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Python使用matplotlib實(shí)現(xiàn)在坐標(biāo)系中畫(huà)一個(gè)矩形的方法
這篇文章主要介紹了Python使用matplotlib實(shí)現(xiàn)在坐標(biāo)系中畫(huà)一個(gè)矩形的方法,涉及matplotlib模塊繪制圖形的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Django框架靜態(tài)文件使用/中間件/禁用ip功能實(shí)例詳解
這篇文章主要介紹了Django框架靜態(tài)文件使用/中間件/禁用ip功能,結(jié)合實(shí)例形式詳細(xì)分析了Django框架靜態(tài)文件的使用、中間件的原理、操作方法以及禁用ip功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07
PyTorch實(shí)現(xiàn)線性回歸詳細(xì)過(guò)程
本文介紹PyTorch實(shí)現(xiàn)線性回歸,線性關(guān)系是一種非常簡(jiǎn)單的變量之間的關(guān)系,因變量和自變量在線性關(guān)系的情況下,可以使用線性回歸算法對(duì)一個(gè)或多個(gè)因變量和自變量間的線性關(guān)系進(jìn)行建模,該模型的系數(shù)可以用最小二乘法進(jìn)行求解,需要的朋友可以參考一下2022-03-03
Python利用遞歸實(shí)現(xiàn)文件的復(fù)制方法
今天小編就為大家分享一篇Python利用遞歸實(shí)現(xiàn)文件的復(fù)制方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化
這篇文章主要介紹了pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-05-05
淺談如何使用python抓取網(wǎng)頁(yè)中的動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)
這篇文章主要介紹了淺談如何使用python抓取網(wǎng)頁(yè)中的動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
使用numpy.eye創(chuàng)建one-hot編碼的實(shí)現(xiàn)
本文主要介紹了使用numpy.eye創(chuàng)建one-hot編碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08

