scrapy 2.3 其他XPath扩展
scrapy选择器还提供一个非常遗漏的xpath扩展函数 has-class 它会回来 True 对于具有所有指定HTML类的节点。
对于以下HTML::
<p class="foo bar-baz">First</p>
<p class="foo">Second</p>
<p class="bar">Third</p>
<p>Fourth</p>
你可以这样使用它:
>>> response.xpath('//p[has-class("foo")]')
[<Selector xpath='//p[has-class("foo")]' data='<p class="foo bar-baz">First</p>'>,
<Selector xpath='//p[has-class("foo")]' data='<p class="foo">Second</p>'>]
>>> response.xpath('//p[has-class("foo", "bar-baz")]')
[<Selector xpath='//p[has-class("foo", "bar-baz")]' data='<p class="foo bar-baz">First</p>'>]
>>> response.xpath('//p[has-class("foo", "bar")]')
[]
所以XPath //p[has-class("foo", "bar-baz")] 大致相当于CSS p.foo.bar-baz . 请注意,在大多数情况下,它的速度较慢,因为它是一个纯Python函数,可以为问题中的每个节点调用,而CSS查找被转换为xpath,因此运行效率更高,因此性能方面,它的使用仅限于不容易用css选择器描述的情况。
Parsel还简化了添加自己的xpath扩展。
parsel.xpathfuncs.
set_xpathfunc
(fname, func)[源代码]-
注册要在xpath表达式中使用的自定义扩展函数。
函数
func
注册于fname
将为每个匹配节点调用标识符,并将其传递给context
参数以及从相应的xpath表达式传递的任何参数。如果
func
是None
,将删除扩展功能。查看更多 in lxml documentation .