Scrapy選擇器(Selector)

當刮取網頁中的數據,需要通過使用XPath或CSS表達式來實現選擇器機制提取HTML源代碼的某些部分。選擇器是在Python語言的XML和LXML庫建成的

我們使用下面的代碼片段在本章中來定義選擇器不同的概念:

My Website Scrapy Hello world

構造選擇器


可以通過 text 或 TextResponse 對象構造選擇器類的實例。根據所提供的輸入類型,選擇器選擇以下規則:

from scrapy.selector import Selector
from scrapy.http import HtmlResponse

使用上面的代碼,可以從文本建構如下:

Selector(text=body).xpath('//span/text()').extract()

它顯示的結果爲:

[u'Hello world!!!']

您可以從響應構建:

response = HtmlResponse(url='http://yiibai.com', body=body)
Selector(response=response).xpath('//span/text()').extract()

它顯示的結果爲:

[u'Hello world!!!']

使用選擇器


使用上面的示例代碼片段,您可以構建XPath選擇 title 標籤定義的標題文本,如下圖所示:

>>response.selector.xpath('//title/text()') 

現在,您可以通過使用 .extract()方法提取文本數據,如下所示:

>>response.xpath('//title/text()').extract()

它將產生結果如下:

[u'My Website']

它顯示所有元素的名稱,如下所示:

>>response.xpath('//div[@class="links"]/a/text()').extract()

它提供的元素顯示如下:

Link 1
Link 2
Link 3

如果要提取的第一個元素,那麼使用 .extract_first()方法,如下圖所示:

>>response.xpath('//div[@class="links"]/a/text()').extract_first()

它將顯示元素爲:

Link 1

嵌套選擇器


使用上面的代碼,通過使用.xpath()方法可以嵌套選擇器來顯示頁面的鏈接和圖像源,如下圖所示:

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

它將顯示的結果爲:

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']

使用正則表達式選擇器


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

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

上面一行代碼顯示圖像的名稱爲:

[u'Link 1',
u'Link 2',
u'Link 3']

用相對的XPaths


當您使用XPaths,它是從 / 開始工作的,嵌套選擇器和XPath都關聯到文件的絕對路徑,而不是選擇器的相對路徑。

如果想提取

元素,那麼首先獲得所有 div 元素:

>>mydiv = response.xpath('//div')

接下來,可以在裏面提取所有 'P' 元素,在XPath前綴加上一個句點 .//p ,如下圖所示:

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

使用EXSLT擴展


EXSLT是一個社區它發出擴展XML文檔轉換爲XHTML文檔XSLT(可擴展樣式表語言轉換)。可以使用 EXSLT 擴展與 XPath 表達式來註冊名稱空間,如下列表中所示:

S.N.

前綴用法

命名空間

1

re

正則表達式

http://exslt.org/regular-expressions

2

set

集合操作

http://exslt.org/sets

您可以檢查在上一節中使用正則表達式提取數據的代碼格式。

有一些關於 XPath 的提示,使用 XPath 與 Scrapy 選擇器時非常有用。欲瞭解更多信息,請點擊此 鏈接