現(xiàn)在我們用 Scrapy 官方提供的測試網(wǎng)址:" http://doc.scrapy.org/en/latest/_static/selectors-sample1.html " 為例,看看選擇器的用法。
測試頁面 HTML 代碼如下:
<html>
<head>
<base />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br />![](image1_thumb.jpg)</a>
<a href='image2.html'>Name: My image 2 <br />![](image2_thumb.jpg)</a>
<a href='image3.html'>Name: My image 3 <br />![](image3_thumb.jpg)</a>
<a href='image4.html'>Name: My image 4 <br />![](image4_thumb.jpg)</a>
<a href='image5.html'>Name: My image 5 <br />![](image5_thumb.jpg)</a>
</div>
</body>
</html>
使用 Shell 來測試:
scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
·
·
1.extract()
方法
把被提取的內(nèi)容轉(zhuǎn)換為文本率翅,輸出一個列表茅诱。
>>> response.xpath('//title/text()').extract()
['Example website']
>>> response.css('img').xpath('@src').extract()
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
如果只想獲得被提取內(nèi)容的第一個鸯旁,可以使用 extract_first()
方法:
>>> response.css('img').xpath('@src').extract_first()
'image1_thumb.jpg'
判斷提取內(nèi)容內(nèi)容是否存在残家,用 is None
泣港。
>>> response.xpath('//div[@id="not-exists"]/text()').extract_first() is None
True
當(dāng)提取內(nèi)容不存在時兽间,可以設(shè)定默認(rèn)值历葛。
>>> response.xpath('//div[@id="not-exists"]/text()').extract_first(default='not-found')
'not-found'
CSS 選擇器可以使用 CSS3 偽元素來提取內(nèi)容。
>>> response.css('title::text').extract()
['Example website']
>>> response.css('base::attr(href)').extract()
['http://example.com/']
>>> response.css('a[href*=image]::attr(href)').extract()
['image1.html',
'image2.html',
'image3.html',
'image4.html',
'image5.html']
2.嵌套選擇器
執(zhí)行選擇器方法后返回的選擇器對象嘀略,可以繼續(xù)對其使用選擇器方法恤溶。
>>> links = response.css('#images')
>>> links.css('a > img::attr(src)').extract()
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
3.使用正則表達(dá)式
直接使用 re()
方法即可。
>>> response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
['My image 1 ',
'My image 2 ',
'My image 3 ',
'My image 4 ',
'My image 5 ']
和 extract_first()
方法類似帜羊,re_first()
返回用正則表達(dá)式提取的內(nèi)容的第一項(xiàng)咒程。
>>> response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
'My image 1 '