鍍金池/ 教程/ Java/ Scrapy選擇器(Selector)
Scrapy項(xiàng)目加載器(Item Loader)
Scrapy快速入門(mén)
Scrapy蜘蛛(Spider)
Scrapy教程
Scrapy定義項(xiàng)目
Scrapy執(zhí)行爬行捉取
Scrapy項(xiàng)目(Items)
Scrapy安裝
Scrapy提取項(xiàng)目
Scrapy第一個(gè)Spider
Scrapy選擇器(Selector)
Scrapy Shell
Scrapy創(chuàng)建項(xiàng)目
Scrapy命令行工具
Scrapy日志
Scrapy使用項(xiàng)目

Scrapy選擇器(Selector)

當(dāng)刮取網(wǎng)頁(yè)中的數(shù)據(jù),需要通過(guò)使用XPath或CSS表達(dá)式來(lái)實(shí)現(xiàn)選擇器機(jī)制提取HTML源代碼的某些部分。選擇器是在Python語(yǔ)言的XML和LXML庫(kù)建成的
我們使用下面的代碼片段在本章中來(lái)定義選擇器不同的概念:
<html>
 <head>
  <title>My Website</title>
 </head>
 <body>
  <span>Scrapy Hello world</span>
  <div class='links'>
   <a href='one.html'>Link 1<img src='image1.jpg'/></a>
   <a href='two.html'>Link 2<img src='image2.jpg'/></a>
   <a href='three.html'>Link 3<img src='image3.jpg'/></a>
  </div>
 </body>
</html>

構(gòu)造選擇器

可以通過(guò) text 或 TextResponse 對(duì)象構(gòu)造選擇器類(lèi)的實(shí)例。根據(jù)所提供的輸入類(lèi)型,選擇器選擇以下規(guī)則:

from scrapy.selector import Selector
from scrapy.http import HtmlResponse
使用上面的代碼,可以從文本建構(gòu)如下:
Selector(text=body).xpath('//span/text()').extract()
它顯示的結(jié)果為:
[u'Hello world!!!']
您可以從響應(yīng)構(gòu)建:
response = HtmlResponse(url='http://yiibai.com', body=body)
Selector(response=response).xpath('//span/text()').extract()

它顯示的結(jié)果為:

[u'Hello world!!!']

使用選擇器

使用上面的示例代碼片段,您可以構(gòu)建XPath選擇 title 標(biāo)簽定義的標(biāo)題文本,如下圖所示:
>>response.selector.xpath('//title/text()') 

現(xiàn)在,您可以通過(guò)使用 .extract()方法提取文本數(shù)據(jù),如下所示:

>>response.xpath('//title/text()').extract()
它將產(chǎn)生結(jié)果如下:
[u'My Website']
它顯示所有元素的名稱(chēng),如下所示:
>>response.xpath('//div[@class="links"]/a/text()').extract()
它提供的元素顯示如下:
Link 1
Link 2
Link 3
如果要提取的第一個(gè)元素,那么使用 .extract_first()方法,如下圖所示:
>>response.xpath('//div[@class="links"]/a/text()').extract_first()
它將顯示元素為:
Link 1

嵌套選擇器

使用上面的代碼,通過(guò)使用.xpath()方法可以嵌套選擇器來(lái)顯示頁(yè)面的鏈接和圖像源,如下圖所示:
links = response.xpath('//a[contains(@href, "image")]')
for index, link in enumerate(links):
    args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract())
    print 'The link %d pointing to url %s and image %s' % args
它將顯示的結(jié)果為:
Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']

使用正則表達(dá)式選擇器

Scrapy 允許使用 .re() 方法正則表達(dá)式來(lái)提取數(shù)據(jù)。從上面的HTML代碼中可提取圖像名稱(chēng),如下圖所示:

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
上面一行代碼顯示圖像的名稱(chēng)為:
[u'Link 1',
 u'Link 2',
 u'Link 3']

用相對(duì)的XPaths

當(dāng)您使用XPaths,它是從 / 開(kāi)始工作的,嵌套選擇器和XPath都關(guān)聯(lián)到文件的絕對(duì)路徑,而不是選擇器的相對(duì)路徑。

如果想提取<p>元素,那么首先獲得所有 div 元素:
>>mydiv = response.xpath('//div')

接下來(lái),可以在里面提取所有 'P' 元素,在XPath前綴加上一個(gè)句點(diǎn) .//p ,如下圖所示:

>>for p in mydiv.xpath('.//p').extract()

使用EXSLT擴(kuò)展

EXSLT是一個(gè)社區(qū)它發(fā)出擴(kuò)展XML文檔轉(zhuǎn)換為XHTML文檔XSLT(可擴(kuò)展樣式表語(yǔ)言轉(zhuǎn)換)??梢允褂?EXSLT 擴(kuò)展與 XPath 表達(dá)式來(lái)注冊(cè)名稱(chēng)空間,如下列表中所示:

S.N.
前綴用法
命名空間
1 re
正則表達(dá)式
http://exslt.org/regular-expressions
2 set
集合操作
http://exslt.org/sets
您可以檢查在上一節(jié)中使用正則表達(dá)式提取數(shù)據(jù)的代碼格式。
有一些關(guān)于 XPath 的提示,使用 XPath 與 Scrapy 選擇器時(shí)非常有用。欲了解更多信息,請(qǐng)點(diǎn)擊此鏈接