W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
為了解釋如何使用選擇器,我們將使用 ?Scrapy shell
? (提供交互式測(cè)試)和位于Scrapy文檔服務(wù)器中的示例頁(yè)面:
https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
為了完整起見,下面是完整的HTML代碼:
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
<a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>
首先,讓我們打開外殼:
scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
然后,在shell加載之后,您將得到可用的響應(yīng) ?response
? shell變量及其附加的選擇器 ?response.selector
? 屬性。
由于我們處理的是HTML,選擇器將自動(dòng)使用HTML解析器。
所以,通過觀察 HTML code 在該頁(yè)面中,讓我們構(gòu)造一個(gè)XPath來選擇title標(biāo)記內(nèi)的文本:
>>> response.xpath('//title/text()')
[<Selector xpath='//title/text()' data='Example website'>]
要實(shí)際提取文本數(shù)據(jù),必須調(diào)用選擇器 ?.get()
? 或 ?.getall()
? 方法如下:
>>> response.xpath('//title/text()').getall()
['Example website']
>>> response.xpath('//title/text()').get()
'Example website'
?.get()
? 始終返回單個(gè)結(jié)果;如果有多個(gè)匹配項(xiàng),則返回第一個(gè)匹配項(xiàng)的內(nèi)容;如果沒有匹配項(xiàng),則不返回任何匹配項(xiàng)。 ?.getall()
? 返回包含所有結(jié)果的列表。
請(qǐng)注意,CSS選擇器可以使用CSS3偽元素選擇文本或?qū)傩怨?jié)點(diǎn):
>>> response.css('title::text').get()
'Example website'
正如你所看到的, ?.xpath()
? 和 ?.css()
? 方法返回 ?SelectorList
? 實(shí)例,它是新選擇器的列表。此API可用于快速選擇嵌套數(shù)據(jù):
>>> response.css('img').xpath('@src').getall()
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
如果只提取第一個(gè)匹配的元素,則可以調(diào)用選擇器 ?.get()
? (或其別名) ?.extract_first()
? 常用于舊版本):
>>> response.xpath('//div[@id="images"]/a/text()').get()
'Name: My image 1 '
它返回 ?None
? 如果找不到元素:
>>> response.xpath('//div[@id="not-exists"]/text()').get() is None
True
可以將默認(rèn)返回值作為參數(shù)提供,以代替 ?None
? :
>>> response.xpath('//div[@id="not-exists"]/text()').get(default='not-found')
'not-found'
而不是使用例如 ?'@src'
? xpath可以使用 ?.attrib
? A的性質(zhì) Selector :
>>> [img.attrib['src'] for img in response.css('img')]
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
作為捷徑, ?.attrib
? 也可以直接在SelectorList上使用;它返回第一個(gè)匹配元素的屬性:
>>> response.css('img').attrib['src']
'image1_thumb.jpg'
當(dāng)只需要一個(gè)結(jié)果時(shí)(例如,按id選擇,或在網(wǎng)頁(yè)上選擇唯一元素時(shí)),此選項(xiàng)最有用:
>>> response.css('base').attrib['href']
'http://example.com/'
現(xiàn)在我們將獲得基本URL和一些圖像鏈接:
>>> response.xpath('//base/@href').get()
'http://example.com/'
>>> response.css('base::attr(href)').get()
'http://example.com/'
>>> response.css('base').attrib['href']
'http://example.com/'
>>> response.xpath('//a[contains(@href, "image")]/@href').getall()
['image1.html',
'image2.html',
'image3.html',
'image4.html',
'image5.html']
>>> response.css('a[href*=image]::attr(href)').getall()
['image1.html',
'image2.html',
'image3.html',
'image4.html',
'image5.html']
>>> response.xpath('//a[contains(@href, "image")]/img/@src').getall()
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
>>> response.css('a[href*=image] img::attr(src)').getall()
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: