1. 程式人生 > >Scrapy元素選擇器Xpath用法彙總

Scrapy元素選擇器Xpath用法彙總

眾所周知,在設計爬蟲時,最麻煩的一步就是對網頁元素進行分析,目前流行的網頁元素獲取的工具有BeautifulSoup,lxml等,而據我使用的體驗而言,Scrapy的元素選擇器Xpath(結合正則表示式)是其中較為出色的一種(個人認為最好啦,當然只能在Scrapy中使用)功能相對較全、使用較為方便,正因為它的豐富性,有時很多功能會忘記,所以在這裡整理好記錄下來,方便今後查閱使用。

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

  • 多級定位:依靠html中的多級元素逐步縮小範圍
response.xpath('//table/tbody/tr/td')

//如果知道元素所屬的下標可以用下標選擇
response.xpath('//table/tbody/tr[1]/td'
)
  • 跳級定位:符號“//”表示跳級定位,即對當前元素的所有層數的子元素(不僅是第一層子元素)進行查詢,一般xpath的開頭都是跳級定位
response.xpath('//span//table')

2. 依靠元素的屬性定位

每個html元素都有很多屬性,如id、class、title、href、text(href和text往往可以配合正則表示式)等,這些屬性往往具有很強的特殊性,結合元素多級定位或跳級定位會更準確高效,下面舉幾個典型的例子,其他的舉一反三

  • 利用class定位
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結合正則表示式定位
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]
  • 提取元素的屬性
//提取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為包含該段的字串

以上