经院吉吉:
首先说明一下,在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选择器的简单用法表,欢迎大家指出不足,鄙人虚心请教。