三分钟学会Scrapy选择器(selectors)

入门级爬虫总体分为两步:下载网页、提取数据

提取数据是我们的终极目的,提取数据的方法很多。最原始的是正则表达式,即使正则表达式是那么的不人性化,但是不可否认他的强大之处。当然在Python的世界里,它允许你不会使用正则表达式,他给你提供了另一种十分简洁的方法:lxml,它通过层层节点来提取数据。但是这仿佛没有让程序员们停下脚步来,不久更加便捷的BeautifulSoup诞生了,BeautifulSoup会把html拆解成对象处理,全篇转成字典和数组进行处理,操作更加傻瓜。

带来了更大的好处,必然会牺牲一些东西,BeautifulSoup在大大降低提取难度的时候也降低了提取的速度,而这个时候lxml(通过特定的XPath或CSS表达式来选择HTML文件中的某个部分)开始逐渐被大部分希望速度和便捷度并存的程序员所接受。Scrapy就选择了lxml作为它的选择器的基础,Scrapy选择器构建于lxml上,这意味着它在速度和解析准确性上非常相似。

Scrapy的构造器是以文字或TextResponse构造的Selector实例,它会根据输入的类型自动选择最优化的分析方法,而你不需要去考虑里面具体的实现方法。

Scrapy的选择器功能强于lxml与BeautifulSoup,在自由度方面,也高于两者,我们以blog.csdn.net为例,使用Scrapy选择器提取内容。

1、使用.xpath()提取内容

v2-cfae7ac474b2c0e9f0f047e80b2cf36b_b.png

2、使用.css()提取内容

v2-56b9bc6d7d66793b4956de73fd21dea7_b.png

主要内容都写在代码注释中,请配合注释、代码以及输出仔细阅读,如果还对Scrapy的选择器不太了解,可以仔细阅读Scrapy的官方文档。

下面使一些官方文档给出的当你使用Scrapy中的选择器XPath时候可能会有用的一些意见,这些建议是建立在ScrapingHub’s blog ,如果你对XPath还不熟悉,请仔细阅读这篇文章:XPath tutorial.

3、有关于XPath的一些建议

1)使用.代替.//text()

因为.//text()返回的是一个节点集合(set),当一个节点集合(node-set)转强制换成string的时候,它仅仅会返回集合中的第一个元素。

>>> from scrapy import Selector
>>> sel = Selector(text='<a href="#">Click here to go to the <strong>Next Page</strong></a>')
>>> sel.xpath('//a//text()').extract() # take a peek at the node-set
[u'Click here to go to the ', u'Next Page']
>>> sel.xpath("//a[contains(., 'Next Page')]").extract()
[u'<a href="#">Click here to go to the <strong>Next Page</strong></a>']

2)注意//node[1]和(//node)[1]的区别

这种问题,熟悉Python的人都应该知道。

  • //node[1]选择所有位于第一个子节点位置的node节点
  • (//node)[1]选择整个文档中的node节点,并且返回每个node节点的第一个节点

3)使用class查找时优先考虑CSS

因为一个元素可能包含很多的CSS样式,使用XPath中的class选择法很复杂,而使用CSS看起来更加易读。

>>> from scrapy import Selector
>>> sel = Selector(text='<div class="hero shout"><time datetime="2014-07-23 19:00">Special date</time></div>')
>>> sel.css('.shout').xpath('./time/@datetime').extract()
[u'2014-07-23 19:00']

更多文章,关注:知乎专栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值