选择器

现在我们用 Scrapy 官方提供的测试网址:" http://doc.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 />![](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()方法

把被提取的内容转换为文本,输出一个列表。

>>> 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']

如果只想获得被提取内容的第一个,可以使用 extract_first() 方法:

>>> response.css('img').xpath('@src').extract_first()
'image1_thumb.jpg'

判断提取内容内容是否存在,用 is None

>>> response.xpath('//div[@id="not-exists"]/text()').extract_first() is None
True

当提取内容不存在时,可以设定默认值。

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

CSS 选择器可以使用 CSS3 伪元素来提取内容。

>>> 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.嵌套选择器

执行选择器方法后返回的选择器对象,可以继续对其使用选择器方法。

>>> 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.使用正则表达式

直接使用 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() 返回用正则表达式提取的内容的第一项。

>>> response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
'My image 1 '
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 当我们取得了网页的response之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来,python从网页...
    cnkai阅读 3,379评论 0 1
  • 有条件的请支持慕课实战正版课程,本blog仅仅是归纳总结,自用。 一、xpath部分 1.1 xpath简介 1....
    youyuge阅读 24,254评论 1 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,287评论 19 139
  • 一直都在寻找一个这样可以自己写点东西,读读他人的文章,又可以三人安心舒服的世界,可以让人放松一下,溜出繁杂混乱的世...
    希言吖阅读 1,711评论 0 0
  • 亲,你会“调情”吗?你能“变态”吗? 对,就要你“调情”,就要你“变态”! 只不过这“调情”,是指调节情绪;这“变...
    西瓜甜甜啦阅读 5,323评论 7 28

友情链接更多精彩内容