Scrapy有自己的数据提取机制。它们被称为选择器,因为它们“选择”HTML文档的某些部分 XPath 或 CSS 表达。
XPath是一种在XML文档中选择节点的语言,也可以与HTML一起使用。
CSS是用于将样式应用于HTML文档的语言。它定义选择器,将这些样式与特定的HTML元素相关联。
参考文献:scrapy官方文档-选择器https://docs.scrapy.org/en/latest/topics/selectors.html
response.selector.xpath('//span/text()').get() #提取span标签内的值
.selector
属性selector是一个很薄的包装 parsel library;这个包装器的目的是提供更好的与slapy响应对象的集成。
parsel 是一个独立的网页爬取库,可以使用没有 Scrapy 。它使用 lxml库位于引擎盖下,并在LXML API之上实现一个简单的API。这意味着scrapy选择器在速度和解析精度方面与lxml非常相似。
使用xpath和css查询响应非常常见,因此响应中还包含两个快捷方式:
response.xpath()
response.css()
response.xpath('//span/text()').get() #xpath
response.css('span::text').get() #css
如果需要,可以使用 Selector 直接。从文本构建:
from scrapy.selector import Selector
body = 'good'
Selector(text=body).xpath('//span/text()').get()
以scrapy官方文档为例示例:https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
第一步:获取页面节点元素
response.xpath('//title/text()') #结果:[]
第二步:获取文本内容
response.xpath('//title/text()').getall() #['Example website']
response.xpath('//title/text()').get() #'Example website'
**.get()**总是返回一个结果;如果有多个匹配项,则返回第一个匹配项的内容;如果没有匹配项,则返回None。
**.getall()**返回包含所有结果的列表。
除了使用例如**@srcXPath之外,还可以使用.attrib**a的属性查询属性Selector
案例:
response.css('img').attrib['src'] #获取图片链接
Selector还提供了**.re()一种使用正则表达式提取数据的方法。但是,与使用.xpath()**或 **.css()方法不同,它.re()返回字符串列表。因此,您无法构造嵌套.re()**调用。
案例:
response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')