Scrapy選擇器(Selector)


當刮取網頁中的資料,需要通過使用XPath或CSS表示式來實現選擇器機制提取HTML原始碼的某些部分。選擇器是在Python語言的XML和LXML庫建成的
我們使用下面的程式碼片段在本章中來定義選擇器不同的概念:
<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>

構造選擇器

可以通過 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='https://www.tw511.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都關聯到檔案的絕對路徑,而不是選擇器的相對路徑。

如果想提取<p>元素,那麼首先獲得所有 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 選擇器時非常有用。欲瞭解更多資訊,請點選此連結