Scrapy 选择器描述
当你爬取网页时,你需要通过使用称为选择器的机制来提取HTML源的某一部分,通过使用XPath或CSS表达式实现。选择器是建立在lxml库之上的,它用Python语言处理XML和HTML。
使用下面的代码片段来定义选择器的不同概念–
<html>
<head>
<title>My Website</title>
</head>
<body>
<span>Hello world!!!</span>
<div class = 'links'>
<a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
<a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
<a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
</div>
</body>
</html>
Scrapy 创建选择器
你可以通过传递文本或TextResponse对象来构造选择器类实例。
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
使用上述代码,你可以从文本中构建为—
Selector(text = body).xpath('//span/text()').extract()
它将显示结果为–
[u'Hello world!!!']
你可以从Response中构建为–
response = HtmlResponse(url = 'http://mysite.com', body = body)
Selector(response = response).xpath('//span/text()').extract()
它将显示结果为–
[u'Hello world!!!']
Scrapy 使用选择器
使用上述简单的代码片段,你可以构建XPath来选择标题标签中定义的文本,如下图所示
>>response.selector.xpath('//title/text()')
现在,你可以使用如下所示的.extract()
方法提取文本数据 −
>>response.xpath('//title/text()').extract()
它将产生如下结果
[u'My Website']
你可以显示如下所示的所有元素的名称 −
>>response.xpath('//div[@class = "links"]/a/text()').extract()
Link 1
Link 2
Link 3
如果你想提取第一个元素,那么使用方法.extract_first()
,如下所示
>>response.xpath('//div[@class = "links"]/a/text()').extract_first()
它将显示元素为-
Link 1
Scrapy 选择器嵌套
使用上述代码,你可以使用.xpath()
方法嵌套选择器来显示页面链接和图片来源,如下所示
links = response.xpath('//a[contains(@href, "image")]')
for index, link in enumerate(links):
args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract())
print 'The link %d pointing to url %s and image %s' % args
它将显示结果为–
Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']
Scrapy 选择器中使用正则表达式
Scrapy允许使用正则表达式来提取数据,它使用.re()
方法。
>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
上面一行显示的图像名称为-
[u'Link 1',
u'Link 2',
u'Link 3']
Scrapy 使用相对的XPaths
当你使用以/开头的XPaths时,嵌套选择器和XPath都与文档的绝对路径有关,而不是选择器的相对路径。
如果你想提取 <p>
元素,然后首先获得所有的div元素 –
>>mydiv = response.xpath('//div')
接下来,你可以提取里面所有的'p'
元素,方法是在XPath前加一个点,如.//p
,如下图所示
>>for p in mydiv.xpath('.//p').extract()
Scrapy 使用EXSLT扩展
EXSLT是一个发布XSLT(可扩展样式表语言转换)扩展的社区,它将XML文档转换为XHTML文档。你可以在XPath表达式中使用EXSLT扩展和注册的命名空间,如下表所示
Sr.No | Prefix & Usage | 命名空间 |
---|---|---|
1 | re 正则表达式 |
http://exslt.org/regexp/index.html |
2 | set 设置操作 |
http://exslt.org/set/index.html |
你可以在上一节中查看使用正则表达式提取数据的简单代码格式。
有一些XPath提示,在使用XPath与Scrapy选择器时很有用。欲了解更多信息,请点击此链接。