当你爬取一个网页的时候,最普遍的任务你得去做就是从HTML资源中提取数据,有几个库可以让你获取这些,就像:
- beatifulsoup:一个HTML解析库
- lxml :一个XML解析库
Scrapy选择器
Scrapy它有自己的机制对于提取数据,我们叫它选择器,因为它选择了HTML文档中特定的部分要么通过CSS要么是XPath表达式。
XPath是一种语言选择XML文档中的节点,也可以用于HTML中。CSS是一种语言应用于HTML风格的文档中,它定义了选择器来将这些样式与特定的HTML元素关联起来。
Scrapy选择器是parsel库的一个薄薄的包装;这个包装器的目的是更好地集成Scrapy的响应对象。
parsel是一个独立的web抓取库,可以不使用Scrapy。它在底层使用lxml库,并在lxml API之上实现一个简单的API。这意味着粗糙的选择器在速度和解析精度上与lxml非常相似。
使用selcector
构造一个selectors
Response对象在.selector属性上公开选择器实例:
>>> response.selector.xpath('//span/text()').get()
'good'
或者,
>>> response.css('span::text').get()
'good'
Scrapy选择器是选择器类的实例,通过将TextResponse对象或标记作为unicode字符串(在文本参数中)传递来构造。通常不需要手动创建Scrapy选择器:response对象在Spider回调中可用,因此在大多数情况下,使用response.css()和response.xpath()快捷方式更方便。通过使用响应。选择器或这些快捷方式之一还可以确保只解析响应体一次。
但是如果需要,有可能直接使用Selector。从文本构造:
>>> from scrapy.selector import Selector
>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').get()
'good'
从response类构造,HtmlResponse是TextResponse的一个子类。
>>> from scrapy.selector import Selector
>>> from scrapy.http import HtmlResponse
>>> response = HtmlResponse(url='http://example.com', body=body)
>>> Selector(response=response).xpath('//span/text()').get()
'good'
选择器根据输入类型自动选择最佳解析规则(XML vs . HTML)。