蜘蛛采集内置选择器大全python scrapy.Spider(16)SCRAPY最新教程1.51以上版本
选择对象
- class
scrapy.selector.
Selector
(response = None,text = None,type = None ) - 一个实例
Selector
是选择其内容的某些部分的响应的包装器。response
是一个HtmlResponse
或一个XmlResponse
将被用于选择和提取的数据对象。text
是一个unicode字符串或utf-8编码的文本,用于aresponse
不可用的情况。使用text
和response
在一起是未定义的行为。type
定义选择器类型,它可以是"html"
,"xml"
或None
(默认)。如果
type
是None
,则选择器会根据response
类型自动选择最佳类型(参见下文),或者默认选择"html"
与其一起使用的类型text
。如果
type
isNone
和aresponse
被传递,则从响应类型推断出选择器类型,如下所示:"html"
对于HtmlResponse
类型"xml"
对于XmlResponse
类型"html"
除了别的什么
否则,如果
type
设置,则强制选择器类型,不会进行检测。
queryxpath(
)
- 查找与xpath匹配的节点
query
,并将结果作为SelectorList
实例返回, 并将所有元素展平。List元素也实现了Selector
接口。query
是一个包含要应用的XPATH查询的字符串。注意
为方便起见,可以将此方法称为
response.xpath()
css
(
query)
- 应用给定的CSS选择器并返回一个
SelectorList
实例。query
是一个包含要应用的CSS选择器的字符串。在后台,CSS查询使用cssselect库和run
.xpath()
方法转换为XPath查询 。注意
为方便起见,这种方法可以称为
response.css()
regexre(
)
-
应用给定的正则表达式并返回带有匹配项的unicode字符串列表。
regex
可以是已编译的正则表达式,也可以是将使用编译为正则表达式的字符串re.compile(regex)
注意
需要注意的是
re()
和re_first()
两个解码HTML实体(除<
和&
)。
prefix: strregister_namespace(
uri: 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()
re
()
.re()
为此列表中的每个元素调用该方法,并将其结果返回为flaticned,作为unicode字符串列表。
HTML响应的选择器示例
这里有几个Selector
例子来说明几个概念。在所有情况下,我们假设已经Selector
实例化了这样的HtmlResponse
对象:
sel = Selector(html_response)
-
<h1>
从HTML响应主体中选择所有元素,返回Selector
对象列表 (即SelectorList
对象):sel.xpath("//h1")
-
<h1>
从HTML响应主体中提取所有元素的文本,返回unicode字符串列表:sel.xpath("//h1").extract() # this includes the h1 tag sel.xpath("//h1/text()").extract() # this excludes the h1 tag
-
迭代所有
<p>
标签并打印其class属性:for node in sel.xpath("//p"): print node.xpath("@class").extract()
XML响应的选择器示例
这里有几个例子来说明几个概念。在这两种情况下,我们假设已经Selector
实例化了一个XmlResponse
像这样的 对象:
sel = Selector(xml_response)
-
<product>
从XML响应主体中选择所有元素,返回Selector
对象列表(即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博客原子源来说明这一点的例子。
首先,我们打开带有我们要抓取的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'>,
...
如果您想知道为什么默认情况下并不总是调用命名空间删除过程而不必手动调用它,这是因为有两个原因,按照相关性,它们是:
- 删除命名空间需要迭代和修改文档中的所有节点,这对于Scrapy抓取的所有文档执行是相当昂贵的操作
- 在某些情况下,如果某些元素名称在名称空间之间发生冲突,则实际上可能需要使用名称空间。这些案件非常罕见。
评论被关闭。