在scrapy中使用Selector提取数据

经院吉吉:

    首先说明一下,在scrapy中使用选择器是基于Selector这个对象滴,selector对象在scrapy中通过XPATH或是CSS来提取数据的,我们可以自己创建selector对象,但在实际开发中我们不需要这样做,因为response内置有selector对象,我们可以直接调用其方法,scrapy源码中相关实现过程如下:

可以看到scrapy.selector模块在selector这个方法中,并且response对象有XPATH和CSS方法,为了更好的运用selector对象,先聊聊XPATH和CSS

XPATH(XML Path Language)

基本语法
name 选取name元素的所有子节点
/name 选取根元素name
name/a x选取所有属于name的子元素的a元素
//div x选取所有div子元素(不论出现文档任何地方)
name//div x选取所有属于name元素的后代的div元素,不管他出现在name之下的任何位置
//@class x选取所有名为class的属性
/name/div[1] x选取属于name子元素的第一个div元素(注意索引值和列表中的规则不同)
/name/div[last()] x选取name子元素最后一个div元素
/name/div[last()-1] x选取属于article子元素的最后一个div元素
//div[@lang] x选取所有拥有lang属性的div元素
//div[@lang='eng'] x选取所有lang属性为eng的div元素
/div/* x选取属性为div元素的所有子节点
//* x选取所有元素
//div[@*] x选取所有带属性的title元素
/div/a | //ul x选取文档中的span和ul元素
//span | //ul x选取文档中的span和ul元素
article/div/p | //span x选取所有属于article元素的div元素的p元素以及文档中所有的span元素

下面介绍xpath中两个常用的字符串函数

string(arg):返回参数的字符串值,来具体看看实例

1.首先创建一个Selector对象

2.结合上面的表格来看看string()的具体功能

其实很容易看出string()代替了text()功能,(其中extract()方法返回选中内容的Unicode字符串)但是不仅仅如此,再来看看对比图

所以得出结论:如果想得出a中的整个字符串"EXO is handsome",使用text()是不行滴,因为两个字符串在不同元素下,这时就要用到string()进行连接了。

  • contain(str1,str2):判断str1中是否包含str2,返回布尔值。不详细说明,举个简单栗子,大家可以试试:
    sel.xpath(//p[contains(@class,"small")])#选择class属性中包含small的p元素

CSS选择器基本语法

* x选择所有节点
#container x选择id为container的节点
.container x选择所有class包含container的节点
li a x选择取所有li下的所有a节点(子节点)
ul + p x选取ul后面的第一个p元素(兄弟节点)
div#container > ul x选取id为container的div的第一个ul子元素
ul ~ p x选取与ul相邻的所有p元素
a[title] x选取所有title属性的a元素
a[href="http://jobbole.com"] x选取所有href属性为jobble.com值的元素
a[href="jobble"] x选取所有href属性包含jobble的a元素
a[href^="jobble"] 选取所有href属性值以jobble开头的a元素
a[href$="jobble"] 选取所有href属性值以jobble结尾的a元素
div:not(#container) x选取所有id非container的div属性
li:nth-child(3) x选取第三个li元素
li:nth-child(2n) d第偶数个li元素
div:empty x选中没有子元素的div元素
div::text x选中div元素的文本节点
[class~=clearfix] x选中包含class属性且值包含clearfix的元素
[class=clearfix]

选中包含class属性且值为clearfix的元素

以上就是xpath和css选择器的简单用法表,欢迎大家指出不足,鄙人虚心请教。

个人微博

猜你喜欢

转载自blog.csdn.net/weixin_41503009/article/details/81055876