开发手册 欢迎您!
软件开发者资料库

Scrapy - 选择器

Scrapy选择器 - 从简单和简单的步骤学习Scrapy,从基本到高级概念,包括概述,环境,命令行工具,蜘蛛,选择器,项目,项目装载程序,外壳,项目管道,Feed导出,请求和响应,链接提取器,设置,例外,创建项目,定义项目,第一个蜘蛛,抓取,提取项目,使用项目,以下链接,Scraped数据,日志记录,统计信息收集,发送电子邮件,Telnet控制台,Web服务。

描述

当您在抓取网页时,您需要使用名为选择器的机制来提取HTML源的某个部分,使用XPath或CSS表达式.选择器基于 lxml 库构建,该库以Python语言处理XML和HTML.

使用以下代码片段来定义选择器的不同概念 :

         My Website               Hello world!!!               Link 1         Link 2         Link 3      
   

构造选择器

您可以通过传递文本来构造选择器类实例 TextResponse 对象.根据提供的输入类型,选择器选择以下规则 :

from scrapy.selector import Selector from scrapy.http import HtmlResponse

使用上面的代码,您可以从文本构造为 :

Selector(text = body).xpath('//span/text()').extract()

它将显示结果为 :

[u'Hello world!!!']

你可以从响应构建为 :

response = HtmlResponse(url = 'http://mysite.com', body = body) Selector(response = response).xpath('//span/text()').extract()

它将显示结果为 :

  [u'Hello world !!!']

使用选择器

使用上面的简单c ode片段,您可以构造XPath以选择标题标签中定义的文本,如下所示 :

>>response.selector.xpath('//title/text()')

现在,您可以使用 .extract()提取文本数据方法如下所示 :

 >> response.xpath('//title/text()'). extract()

它会产生结果为 :

  [u'My Website']

您可以显示所有元素的名称,如下所示 :

>>response.xpath('//div[@class = "links"]/a/text()').extract()

它将显示元素为 :

Link 1Link 2Link 3

如果你想提取第一个元素,那么你方法 .extract_first(),如下所示 :

 >> response.xpath('//div [@class ="links"]/a/text()').extract_first()

它将元素显示为 :

  Link 1

嵌套选择器

使用上面的代码,您可以使用 .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允许提取使用正则表达式的数据,使用 .re()方法.从上面的HTML代码中,我们将提取如下所示的图像名称 :

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

上面的行显示图像名称为 :

[u'Link 1', u'Link 2', u'Link 3']

使用相对XPath

当您使用XPath时,以/开头,嵌套选择器和XPath与文档的绝对路径相关,而不是选择器的相对路径.

如果要提取< p> 元素,然后首先获得所有div元素 :

 >> mydiv = response .xpath('//div')

接下来,您可以通过在前面添加前缀来提取内部的所有'p'元素带有点为 .//p 的XPath,如下所示&m inus;

 >> for p in mydiv.xpath('.//p').extract()

使用EXSLT扩展

EXSLT是一个发布XSLT(可扩展样式表语言转换)扩展的社区,它将XML文档转换为XHTML文档.您可以在XPath表达式中使用带有已注册命名空间的EXSLT扩展,如下表所示 :

Sr.No前缀&用法命名空间
1

重新

正则表达式

http://exslt.org/regexp/index.html

2

设置

设置操作

http://exslt.org/set/index.html

您可以查看简单的代码格式在上一节中使用正则表达式提取数据.

有一些XPath技巧,在将XPath与Scrapy选择器一起使用时非常有用.有关详细信息.