- Scrapy 教程
- Scrapy - 首頁
- Scrapy 基本概念
- Scrapy - 概述
- Scrapy - 環境
- Scrapy - 命令列工具
- Scrapy - 爬蟲 (Spiders)
- Scrapy - 選擇器
- Scrapy - 專案 (Items)
- Scrapy - 專案載入器 (Item Loaders)
- Scrapy - Shell
- Scrapy - 專案管道 (Item Pipeline)
- Scrapy - 資料匯出 (Feed exports)
- Scrapy - 請求 & 響應
- Scrapy - 連結提取器 (Link Extractors)
- Scrapy - 設定
- Scrapy - 異常
- Scrapy 實戰專案
- Scrapy - 建立專案
- Scrapy - 定義專案
- Scrapy - 第一個爬蟲
- Scrapy - 爬取
- Scrapy - 提取專案
- Scrapy - 使用專案
- Scrapy - 跟蹤連結
- Scrapy - 抓取的資料
- Scrapy 有用資源
- Scrapy - 快速指南
- Scrapy - 有用資源
- Scrapy - 討論
Scrapy - 選擇器
描述
當您抓取網頁時,需要使用稱為選擇器的機制來提取HTML原始碼的特定部分,這可以透過使用XPath或CSS表示式來實現。選擇器基於lxml庫構建,該庫使用Python語言處理XML和HTML。
使用以下程式碼片段來定義選擇器的不同概念:
<html>
<head>
<title>My Website</title>
</head>
<body>
<span>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>
構建選擇器
您可以透過傳遞文字或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://mysite.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']
使用相對XPath
當您使用以/開頭的XPath時,巢狀選擇器和XPath與文件的絕對路徑相關,而不是選擇器的相對路徑。
如果要提取<p>元素,則首先獲取所有div元素:
>>mydiv = response.xpath('//div')
接下來,您可以透過在XPath前面新增一個點作為.//p來提取內部的所有'p'元素,如下所示:
>>for p in mydiv.xpath('.//p').extract()
使用EXSLT擴充套件
EXSLT是一個社群,它釋出對XSLT(可擴充套件樣式表語言轉換)的擴充套件,該語言將XML文件轉換為XHTML文件。您可以使用XPath表示式中註冊的名稱空間使用EXSLT擴充套件,如下表所示:
| 序號 | 字首 & 用途 | 名稱空間 |
|---|---|---|
| 1 | re 正則表示式 |
|
| 2 | set 集合操作 |
您可以在上一節中檢視使用正則表示式提取資料的簡單程式碼格式。
有一些XPath技巧,在Scrapy選擇器中使用XPath時非常有用。更多資訊,請點選此連結。