我正在使用scrapy,我正在尝试寻找包含特定文本的跨度.我有:
response.selector.xpath('//*[@class="ParamText"]/span/node()')
Run Code Online (Sandbox Code Playgroud)
返回:
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>,
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u'C'>,
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>]
Run Code Online (Sandbox Code Playgroud)
但是,当我跑:
>>> response.selector.xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]')
Out[11]: []
Run Code Online (Sandbox Code Playgroud)
为什么包含函数不起作用?
har*_*r07 11
contains()
无法一次评估多个节点:
/span[contains(text(),"STODOLINK")]
Run Code Online (Sandbox Code Playgroud)
因此,如果内部有多个文本节点span
,并且"STODOLINK"
不在第一个文本节点子节点中span
,那么contains()
在上面的表达式中将无效.您应该尝试contains()
对单个文本节点应用检查,如下所示:
//*[@class="ParamText"]/span[text()[contains(.,"STODOLINK")]]
Run Code Online (Sandbox Code Playgroud)
或者如果"STODOLINK"
不一定直接位于span
(可以嵌套在其他元素中span
),那么您可以简单地使用.
而不是text()
:
//*[@class="ParamText"]/span[contains(.,"STODOLINK")]
Run Code Online (Sandbox Code Playgroud)