Scrapy – 选择器

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>

构建选择器

你可以通过传递 文本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!!!']

使用选择器

使用上述简单的代码片段,你可以构建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

嵌套选择器

使用上述代码,你可以使用 . 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'] 

使用相对的XPaths

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

如果你想提取 **< p> **元素,那么首先要获得所有的div元素-

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

接下来,你可以提取里面所有的 p 元素,方法是在XPath前加一个点,如 .//p ,如下图所示

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

使用EXSLT扩展

EXSLT是一个发布XSLT(Extensible Stylesheet Language Transformations)扩展的社区,它将XML文档转换为XHTML文档。你可以在XPath表达式中使用EXSLT扩展和注册的命名空间,如下表所示

序号 前缀和用法 命名空间
1 re 正则表达式 http://exslt.org/regexp/index.html
2 set 操作 http://exslt.org/set/index.html

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

有一些XPath提示,在使用XPath与Scrapy选择器时很有用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程