文档章节

【Scrapy】 selector 学习记录三(Selector详细介绍)

ok绷了绷
 ok绷了绷
发布于 2017/01/01 17:14
字数 1173
阅读 42
收藏 0

Selector的详细介绍

class scrapy.selector.Selector(response = None,text = None,type = None)

selector 是对 response 的封装,用来对选取其中的特定内容。

下面是 Selector 的主要成员变量:

  • response 一个HtmlResponse或者XmlResponse对象

  • text 一个unicode字符串或者utf-8文本,当response为空的时候才有效。同时使用text和response是未定义行为

  • type 定义selector的类型,可以是html、xml或None(default)

    • 如果type为None,那么selector会根据response自动选择最佳的type,如果定义了text那么默认成html类型
    • response的类型确定
    • xml:XmlResponse
    • html:HtmlResponse
    • html:其他类型
    • 如果已经设定了type那么强制使用设定好的type。

主要成员函数:

- xpath() 寻找匹配xpath query 的节点,并返回 SelectorList 的一个实例结果,单一化其所有元素。返回的列表元素也实现了 Selector 的接口。query 是包含XPATH查询请求的字符串。
- css() 应用给定的CSS选择器,返回 SelectorList 的一个实例。在后台,通过 cssselect 库和运行 .xpath() 方法,CSS查询会被转换为XPath查询。
- extract() 串行化并将匹配到的节点返回一个unicode字符串列表。 结尾是编码内容的百分比
- reg(regex) 应用给定的regex,并返回匹配到的unicode字符串列表。regex 可以是一个已编译的正则表达式,也可以是一个将被 re.compile(regex) 编译为正则表达式的字符串。
- register_namespaces(prefix, uri) 注册给定的命名空间,其将在 Selector 中使用。 不注册命名空间,你将无法从非标准命名空间中选择或提取数据。
- remove_namespaces() 移除所有的命名空间,允许使用少量的命名空间xpaths遍历文档
- __nonzero__() 如果选择了任意的真实文档,将返回 True ,否则返回 False 。 也就是说, Selector 的布尔值是通过它选择的内容确定的。

SelectorList对象

class scrapy.selector.SelectorList

SelectorList 类是内建 list 类的子类,提供了一些额外的方法。

- xpath(query) 对列表中的每个元素调用 .xpath() 方法,返回结果为另一个单一化的     SelectorList
- css(query) 对列表中的各个元素调用 .css() 方法,返回结果为另一个单一化的 SelectorList
- extract() 对列表中的各个元素调用 .extract() 方法,返回结果为单一化的unicode字符串列表
- re() 对列表中的各个元素调用 .re() 方法,返回结果为单一化的unicode字符串列表
- __nonzero__() 列表非空则返回True,否则返回False

在XML响应上的选择器样例

假设已经有一个通过 XmlResponse 对象实例化的 Selector ,如下:

sel = Selector(xml_response)

选择所有的 元素,返回SelectorList :

sel.xpath(“//product”)

从 Google Base XML feed 中提取所有的价钱,这需要注册一个命名空间:

sel.register_namespace("g", "http://base.google.com/ns/1.0")
sel.xpath("//g:price").extract()

移除命名空间

在处理爬虫项目时,可以完全去掉命名空间而仅仅处理元素名字,这样在写更多简单/实用的XPath会方便很多。为此可以使用Selector.remove_namespaces()方法。

以Github博客的atom订阅来解释这个情况。

首先,我们使用想爬取的url来打开shell:

scrapy shell https://github.com/blog.atom

一旦进入shell,我们可以尝试选择所有的 <link> 对象,可以看到没有结果(因为Atom XML命名空间混淆了这些节点):

>>> response.xpath("//link")
[]

但一旦我们调用 **Selector.remove_namespaces() **方法,所有的节点都可以直接通过他们的名字来访问:

>>> response.selector.remove_namespaces()
>>> response.xpath("//link")  
[<Selector xpath='//link' data=u'<link xmlns="http://www.w3.org/2005/Atom'>,
<Selector xpath='//link' data=u'<link xmlns="http://www.w3.org/2005/Atom'>,
...

如果你对为什么命名空间移除操作并不总是被调用,而需要手动调用有疑惑。这是因为存在如下两个原因,按照相关顺序如下: 1. 移除命名空间需要迭代并修改文件的所有节点,而这对于Scrapy爬取的所有文档操作需要一定的性能消耗 2. 会存在这样的情况,确实需要使用命名空间,但有些元素的名字与命名空间冲突。尽管这些情况非常少见。

如果XPath没有指定命名空间的话,那么它的命名空间为空。如果待解析XML文件含有默认命名空间的话,那么你必须添加那个命名空间的前缀,并且把命名空间的URI添加到XmlNamespaceManager中,否则,你得不到任何查询结果。

对于scrapy,这里提供了register_namespaces(prefix, uri) 和 remove_namespaces()两个函数来解决这个问题。

© 著作权归作者所有

ok绷了绷
粉丝 4
博文 125
码字总数 57978
作品 0
海淀
私信 提问
Python爬虫Scrapy(三)_Scrapy Shell

本篇将介绍使用scrapy的命令,更多内容请参考:Python学习指南 Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查...

小七奇奇
2017/12/26
0
0
Netty源码分析(二)EventLoopGroup分析

准备将Netty的源码过一下,一来对自己是个总结消化的过程,二来希望对那些打算看Netty源码的人(已经熟悉Netty的Reactor模型)能有一些帮助。目前所看Netty版本是4.1.3.Final。 1 目录 - Ne...

乒乓狂魔
2016/09/06
421
0
Java NIO之Selector(选择器)

历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 超详细的Jav...

山川_84b6
2018/05/16
0
0
UiPath基础篇 - 文本自动化1

不知不觉2019已经过半,感谢小伙伴们对小白修炼营一如既往的支持,小白会继续努力,为大家带来更优质的内容,也期待新同学的加入! 言归正传,又到了UiPath基础篇学习的part,今天我们要学习...

哈皮小白
07/04
0
0
go微服务框架go-micro深度学习(三) Registry服务的注册和发现

服务的注册与发现是微服务必不可少的功能,这样系统才能有更高的性能,更高的可用性。go-micro框架的服务发现有自己能用的接口Registry。只要实现这个接口就可以定制自己的服务注册和发现。 ...

Ala6
2018/10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

solidity智能合约中tx.origin的正确使用场景

简介 tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址。在智能合约中使用此变量进行身份验证会使合约容易受到类似网络钓鱼的攻击。 但针对t...

程序新视界
35分钟前
0
0
代码详解:基于Python建立任意层数的深度神经网络

全文共6359字,预计学习时长20分钟或更长 图片来源:pexels.com/@divinetechygir 在这篇指南中,我们将建立起一个任意层数的深度神经网络。这个神经网络可以应用于二元分类的监督学习问题。 ...

读芯术
37分钟前
2
0
使用mybatis-plus-gennretor代码生成器生成代码

1导入需要的jar包 <dependencies> <!-- mp依赖 mybaits-plus 会自动维护mybaits jar包 所以不用加入了 防止版本冲突 --> <dependency> <groupId>com.ba......

小小小施爷
55分钟前
1
0
巨杉Tech | 微服务趋势下的数据库设计与应用简析

上周五(7月12日)巨杉数据库参与了由得到App主办八里庄技术沙龙活动,分享主题是关于分布式数据库架构与实战。 以下就是根据巨杉数据库现场分享的内容进行的分享实录整理。 巨杉数据库简介 ...

巨杉数据库
今天
70
0
借助URLOS快速安装AliSQL

环境需求 最低硬件配置:1核CPU,1G内存(1+1)提示:如果你的应用较多,而主机节点的硬件配置较低,建议在部署节点时开通虚拟虚拟内存; 生产环境建议使用2G或以上内存; 推荐安装系统:Ubu...

躲猫猫_007
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部