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

来源:互联网 发布:office官方卸载软件 编辑:程序博客网 时间:2024/05/17 07:56

(文中图片看不清楚,可以点击阅读原文,阅读我在知乎专栏同步发送的文章)

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

提取数据是我们的终极目的,提取数据的方法很多。最原始的是正则表达式,即使正则表达式是那么的不人性化,但是不可否认他的强大之处。当然在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()提取内容

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

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

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

3、有关于XPath的一些建议

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

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




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

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

  • //node[1]选择所有位于第一个子节点位置的node节点

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


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

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



(文中图片看不清楚,可以点击阅读原文,阅读我在知乎专栏同步发送的文章)

原创粉丝点击