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>

构造选择器

您可以通过传递 textTextResponse 对象来构造选择器类实例。根据提供的输入类型,选择器选择以下规则-
from scrapy.selector import Selector 
from scrapy.http import HtmlResponse
使用上面的代码,你可以从文本构造为-
Selector(text = body).xpath('//span/text()').extract() 
它将显示 r结果为-
[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'] 

使用相对 XPath

当您使用以 / 开头的 XPath 时,嵌套选择器和 XPath 与文档的绝对路径相关,而不是选择器的相对路径。
如果你想提取元素,那么首先获取所有的div元素-
>>mydiv = response.xpath('//div')
接下来,您可以提取里面的所有 'p' 元素,方法是在 XPath 前面加上一个点作为 .//p 的前缀,如下所示-
>>for p in mydiv.xpath('.//p').extract() 

使用 EXSLT 扩展

EXSLT 是一个社区,它发布 XSLT(可扩展样式表语言转换)的扩展,将 XML 文档转换为 XHTML 文档。您可以将 EXSLT 扩展与 XPath 表达式中的注册命名空间一起使用,如下表所示-
前缀和用法 命名空间
re
正则表达式
http://exslt.org/regexp/index.html
set
set 操作
http://exslt.org/set/index.html
您可以查看上一节中使用正则表达式提取数据的简单代码格式。
有一些 XPath 提示,在将 XPath 与 Scrapy 选择器一起使用时非常有用。如需更多信息,请点击此链接。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4