網絡爬蟲之Xpath用法彙總

衆所周知,在設計爬蟲時,最麻煩的一步就是對網頁元素進行分析,目前流行的網頁元素獲取的工具備BeautifulSoup,lxml等,而據我使用的體驗而言,Scrapy的元素選擇器Xpath(結合正則表達式)是其中較爲出色的一種,功能相對較全、使用較爲方便,正由於它的豐富性,有時不少功能會忘記,因此在這裏整理好記錄下來,方便從此查閱使用。javascript

1. 元素的多級定位與跳級定位

  • 多級定位:依靠html中的多級元素逐步縮小範圍
  • response.xpath('//table/tbody/tr/td') //若是知道元素所屬的下標能夠用下標選擇
    response.xpath('//table/tbody/tr[1]/td')

跳級定位:符號「//」表示跳級定位,即對當前元素的全部層數的子元素(不只是第一層子元素)進行查找,通常xpath的開頭都是跳級定位php

response.xpath('//span//table')

2. 依靠元素的屬性定位

每一個html元素都有不少屬性,如id、class、title、href、text(href和text每每能夠配合正則表達式)等,這些屬性每每具備很強的特殊性,結合元素多級定位或跳級定位會更準確高效,下面舉幾個典型的例子,其餘的觸類旁通html

利用class定位java

response.xpath('//td[@class="mc_content"]')

利用href配合正則表達式定位正則表達式

response.xpath('//a[re:test(@href,"^\/index\.php\?m=News&a=details&id=1&NewsId=\d{1,4}")]')

利用text結合正則表達式定位scrapy

a=response.xpath('//a[re:test(text(),"\w{4}")]')

此外,xpath還有對於html元素操做的兩個實用的函數(能夠用正則表達式代替)——starts-with和contains;函數

a=response.xpath('//a[starts-with(@title,"註冊時間")]') a=response.xpath('//a[contains(text(),"聞")]')

3. 提取元素或元素的屬性值工具

首先是最基本的extract()函數,提取被定爲的元素對象測試

 

a=response.xpath('//a[contains(text(),"聞")]').extract() //若是被定爲的元素對象有多個,能夠有用下標指定
a=response.xpath('//a[contains(text(),"聞")]').extract()[1]

 

提取元素的屬性spa

//提取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自帶的函數),能夠對提取的元素進行選擇

//對href中的部分字符串進行選擇
response.xpath('//a[@name="_l_p_n"]/@href').re('\/s.*?list\.htm')

在這裏關於xpath的全部用法基本總結完畢,只是因爲xpath是對靜態元素進行匹配選擇,對於javascript每每一籌莫展,這時不得不用一個自動化測試工具——selenium,能夠實現各類動態事件和靜態元素的選擇,只是selenium每每比較吃內存,響應時間也比較慢,對於大型的爬蟲任務儘可能不要使用,畢竟有一些javascript元素是內嵌在網頁代碼中的,這時候結合萬能的正則表達式,xpath每每可以實現。以下:

 

link = re.search("javascript:goToPage\('(.*?)'", value) //value爲包含該段的字符串
相關文章
相關標籤/搜索