之前已经学习过HTML页面解析的一些内容,其中介绍了选择器的相关知识,接下来深入的学习选择器。
Scrapy的选择器是基于lxml,也就是说二者在原理和速度上是一致的。
构造选择器
Scrapy selector是以 文字(text) 或 TextResponse
构造的Selector
实例。其根据输入的类型自动选择最优的分析方法(XML vs HTML):
>>> from scrapy.selector import Selector
>>> from scrapy.http import HtmlResponse
>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').extract()
[u'good']
以response构造:
>>> response = HtmlResponse(url='http://example.com', body=body)
>>> Selector(response=response).xpath('//span/text()').extract()
[u'good']
使用选择器
以官方文档中的网页为例: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 /><img src='image1_thumb.jpg' /></a> <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a> <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a> <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a> <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a> </div> </body> </html>非常简单的一个页面。
通过scrapy shell对这个页面进行测试。
四种写法都是选择title标签中的文字。1.使用xpath来选择;2和3使用Scrapy提供的方法response.xpath()和response.css(),4使用的是css3伪类来选择文字或属性节点的。
嵌套选择器
选择器方法( .xpath()
or.css()
)返回相同类型的选择器列表,因此你也可以对这些选择器调用选择器方法。下面是一个例子:
正则表达式使用选择器
字符匹配相关内容一定少不了正则表达式。选择器也可以使用正则来提取数据。
对字符串使用re()方法来书写正则。
使用相对XPaths
xpath的语法参见http://www.w3school.com.cn/xpath/
相对XPaths与相对路径有点相似,都是以“.”点前缀开始路径的书写。
使用EXSLT扩展
因建于 lxml 之上, Scrapy选择器也支持一些 EXSLT 扩展,可以在XPath表达式中使用这些预先制定的命名空间。