眾所周知,在設(shè)計爬蟲時,最麻煩的一步就是對網(wǎng)頁元素進行分析,目前流行的網(wǎng)頁元素獲取的工具有BeautifulSoup,lxml等,而據(jù)我使用的體驗而言,Scrapy的元素選擇器Xpath(結(jié)合正則表達式)是其中較為出色的一種(個人認為最好啦,當然只能在Scrapy中使用)功能相對較全、使用較為方便,正因為它的豐富性,有時很多功能會忘記,所以在這里整理好記錄下來,方便今后查閱使用。
1. 元素的多級定位與跳級定位
多級定位:依靠html中的多級元素逐步縮小范圍
response.xpath('//table/tbody/tr/td')
//如果知道元素所屬的下標可以用下標選擇
response.xpath('//table/tbody/tr[1]/td')
跳級定位:符號“//”表示跳級定位,即對當前元素的所有層數(shù)的子元素(不僅是第一層子元素)進行查找,一般xpath的開頭都是跳級定位
response.xpath('//span//table')
2. 依靠元素的屬性定位
每個html元素都有很多屬性,如id、class、title、href、text(href和text往往可以配合正則表達式)等,這些屬性往往具有很強的特殊性,結(jié)合元素多級定位或跳級定位會更準確高效,下面舉幾個典型的例子,其他的舉一反三
利用class定位
response.xpath('//td[@class="mc_content"]')
利用href配合正則表達式定位
response.xpath('//a[re:test(@href,"^\/index\.php\&;m=Newsa=detailsid=1NewsId=\d{1,4}")]')
利用text結(jié)合正則表達式定位
a=response.xpath('//a[re:test(text(),"\w{4}")]')
此外,xpath還有對于html元素操作的兩個實用的函數(shù)(可以用正則表達式代替)——starts-with和contains;
a=response.xpath('//a[starts-with(@title,"注冊時間")]')
a=response.xpath('//a[contains(text(),"聞")]')
3. 提取元素或元素的屬性值
首先是最基本的extract()函數(shù),提取被定為的元素對象
a=response.xpath('//a[contains(text(),"聞")]').extract()
//如果被定為的元素對象有多個,可以有用下標指定
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()
此時我們的正則表達式又閑不住了(scrapy自帶的函數(shù)),可以對提取的元素進行選擇
//對href中的部分字符串進行選擇
response.xpath('//a[@name="_l_p_n"]/@href').re('\/s.*?list\.htm')
在這里關(guān)于xpath的所有用法基本總結(jié)完畢,只是由于xpath是對靜態(tài)元素進行匹配選擇,對于javascript往往束手無策,這時不得不用一個自動化測試工具——selenium,可以實現(xiàn)各種動態(tài)事件和靜態(tài)元素的選擇,只是selenium往往比較吃內(nèi)存,響應(yīng)時間也比較慢,對于大型的爬蟲任務(wù)盡量不要使用,畢竟有一些javascript元素是內(nèi)嵌在網(wǎng)頁代碼中的,這時候結(jié)合萬能的正則表達式,xpath往往能夠?qū)崿F(xiàn)。如下:
link = re.search("javascript:goToPage\('(.*?)'", value) //value為包含該段的字符串
到此這篇關(guān)于Scrapy元素選擇器Xpath用法匯總的文章就介紹到這了,更多相關(guān)Scrapy元素選擇器Xpath 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進行簡單處理和分析
- Django結(jié)合使用Scrapy爬取數(shù)據(jù)入庫的方法示例
- python實現(xiàn)Scrapy爬取網(wǎng)易新聞
- python爬蟲scrapy框架之增量式爬蟲的示例代碼
- 一文讀懂python Scrapy爬蟲框架
- Scrapy實現(xiàn)模擬登錄的示例代碼
- Python爬蟲之教你利用Scrapy爬取圖片