选择对象

classscrapy.selector.Selectorresponse = Nonetext = Nonetype = None 
一个实例Selector是选择其内容的某些部分的响应的包装器。

response是一个HtmlResponse或一个 XmlResponse将被用于选择和提取的数据对象。

text是一个unicode字符串或utf-8编码的文本,用于a response不可用的情况。使用textresponse在一起是未定义的行为。

type定义选择器类型,它可以是"html""xml"None(默认)。

如果typeNone,则选择器会根据response类型自动选择最佳类型(参见下文),或者默认选择"html"与其一起使用的类型text

如果typeis None和a response被传递,则从响应类型推断出选择器类型,如下所示:

否则,如果type设置,则强制选择器类型,不会进行检测。

xpath(query)
查找与xpath匹配的节点query,并将结果作为SelectorList实例返回, 并将所有元素展平。List元素也实现了Selector接口。

query 是一个包含要应用的XPATH查询的字符串。

注意

为方便起见,可以将此方法称为 response.xpath()

css(query)
应用给定的CSS选择器并返回一个SelectorList实例。

query 是一个包含要应用的CSS选择器的字符串。

在后台,CSS查询使用cssselect库和run .xpath()方法转换为XPath查询 。

注意

为方便起见,这种方法可以称为 response.css()

extract()
序列化并将匹配的节点作为unicode字符串列表返回。编码内容百分比未加引号。
re(regex)

应用给定的正则表达式并返回带有匹配项的unicode字符串列表。

regex 可以是已编译的正则表达式,也可以是将使用编译为正则表达式的字符串 re.compile(regex)

注意

需要注意的是re()re_first()两个解码HTML实体(除<&)。

register_namespace(prefix: struri: str)
注册要在此中使用的给定名称空间Selector。如果不注册名称空间,则无法从非标准名称空间中选择或提取数据。见下面的例子。
remove_namespaces()
删除所有名称空间,允许使用无名称空间的xpaths遍历文档。见下面的例子。
__nonzero__()
True如果选择了任何真实内容,则返回False 。换句话说,a的布尔值Selector由它选择的内容给出。

SelectorList对象

class scrapy.selector.SelectorList
SelectorList类是内置的一个子类list 类,它提供了几个方法。

xpath(query)
.xpath()为此列表中的每个元素调用方法,并将其结果作为另一个返回SelectorList

query 与中的一个是相同的论点 Selector.xpath()

css(query)
.css()为此列表中的每个元素调用方法,并将其结果作为另一个返回SelectorList

query 与中的一个是相同的论点 Selector.css()

extract()
.extract()为此列表中的每个元素调用该方法,并将其结果返回为flaticned,作为unicode字符串列表。
re()
.re()为此列表中的每个元素调用该方法,并将其结果返回为flaticned,作为unicode字符串列表。

HTML响应的选择器示例

这里有几个Selector例子来说明几个概念。在所有情况下,我们假设已经Selector实例化了这样的HtmlResponse对象:

sel = Selector(html_response)
  1. <h1>从HTML响应主体中选择所有元素,返回Selector对象列表 (即SelectorList对象):

    sel.xpath("//h1")
  2. <h1>从HTML响应主体中提取所有元素的文本,返回unicode字符串列表:

    sel.xpath("//h1").extract()         # this includes the h1 tag
    sel.xpath("//h1/text()").extract()  # this excludes the h1 tag
  3. 迭代所有<p>标签并打印其class属性:

    for node in sel.xpath("//p"):
        print node.xpath("@class").extract()

XML响应的选择器示例

这里有几个例子来说明几个概念。在这两种情况下,我们假设已经Selector实例化了一个XmlResponse像这样的 对象:

sel = Selector(xml_response)
  1. <product>XML响应主体中选择所有元素,返回Selector对象列表(即SelectorList对象):

    sel.xpath("//product")
  2. 从需要注册命名空间的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博客原子源来说明这一点的例子。

首先,我们打开带有我们要抓取的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. 在某些情况下,如果某些元素名称在名称空间之间发生冲突,则实际上可能需要使用名称空间。这些案件非常罕见。

评论被关闭。