笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

选择器

发布者: 笨鸟自学网



使用选择器

为了解释如何使用选择器,我们将使用 Scrapy shell (提供交互式测试)和位于Scrapy文档服务器中的示例页面:

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加载之后,您将得到可用的响应 response shell变量及其附加的选择器 response.selector 属性。

由于我们处理的是HTML,选择器将自动使用HTML解析器。

所以,通过观察 HTML code 在该页面中,让我们构造一个XPath来选择title标记内的文本:

>>> response.xpath('//title/text()')
[<Selector xpath='//title/text()' data='Example website'>]

要实际提取文本数据,必须调用选择器 .get() 或 .getall() 方法如下:

>>> response.xpath('//title/text()').getall()
['Example website']
>>> response.xpath('//title/text()').get()
'Example website'

.get() 始终返回单个结果;如果有多个匹配项,则返回第一个匹配项的内容;如果没有匹配项,则不返回任何匹配项。 .getall() 返回包含所有结果的列表。

请注意,CSS选择器可以使用CSS3伪元素选择文本或属性节点:

>>> response.css('title::text').get()
'Example website'

正如你所看到的, .xpath() 和 .css() 方法返回 SelectorList 实例,它是新选择器的列表。此API可用于快速选择嵌套数据:

>>> response.css('img').xpath('@src').getall()
['image1_thumb.jpg',
 'image2_thumb.jpg',
 'image3_thumb.jpg',
 'image4_thumb.jpg',
 'image5_thumb.jpg']

如果只提取第一个匹配的元素,则可以调用选择器 .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

可以将默认返回值作为参数提供,以代替 None :

>>> response.xpath('//div[@id="not-exists"]/text()').get(default='not-found')
'not-found'

代替使用例如 '@src' XPath可以使用以下命令查询属性 .attrib 对象的属性 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上使用;它返回第一个匹配元素的属性:

>>> response.css('img').attrib['src']
'image1_thumb.jpg'

当只需要一个结果时(例如,按id选择,或在网页上选择唯一元素时),此选项最有用:

>>> response.css('base').attrib['href']
'http://example.com/'

现在我们将获得基本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'] 

上一篇:蜘蛛下一篇:项目

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-12-4 15:58 , Processed in 0.015397 second(s), 17 queries .

© 2001-2020

返回顶部