- Scrapy教程
- Scrapy - 主页
- Scrapy 基本概念
- Scrapy - 概述
- Scrapy - 环境
- Scrapy - 命令行工具
- Scrapy - 蜘蛛
- Scrapy - 选择器
- Scrapy - 项目
- Scrapy - 物品加载器
- Scrapy - 外壳
- Scrapy - 项目管道
- Scrapy - 饲料出口
- Scrapy - 请求和响应
- Scrapy - 链接提取器
- Scrapy-设置
- Scrapy - 异常
- Scrapy 现场项目
- Scrapy - 创建一个项目
- Scrapy - 定义一个项目
- Scrapy - 第一个蜘蛛
- Scrapy - 爬行
- Scrapy - 提取项目
- Scrapy - 使用项目
- Scrapy - 以下链接
- Scrapy - 抓取数据
- Scrapy 有用的资源
- Scrapy - 快速指南
- Scrapy - 有用的资源
- 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']
使用相对 XPath
当您使用以/开头的 XPath 时,嵌套选择器和 XPath 与文档的绝对路径相关,而不是选择器的相对路径。
如果你想提取<p>元素,那么首先获取所有 div 元素 -
>>mydiv = response.xpath('//div')
接下来,您可以通过在 XPath 前面添加一个点作为.//p来提取其中的所有“p”元素,如下所示 -
>>for p in mydiv.xpath('.//p').extract()
使用 EXSLT 扩展
EXSLT 是一个发布 XSLT(可扩展样式表语言转换)扩展的社区,该扩展可将 XML 文档转换为 XHTML 文档。您可以将 EXSLT 扩展与 XPath 表达式中注册的命名空间一起使用,如下表所示 -
先生编号 | 前缀和用法 | 命名空间 |
---|---|---|
1 | 关于 常用表达 |
|
2 | 放 设置操作 |
您可以查看上一节中使用正则表达式提取数据的简单代码格式。
有一些 XPath 提示,在将 XPath 与 Scrapy 选择器一起使用时非常有用。欲了解更多信息,请点击此链接。