在scrapy中的xPath选择器中使用python变量

在scrapy中的xPath选择器中使用python变量,python,xpath,scrapy,Python,Xpath,Scrapy,我想选择它们的文本包含条的元素。我有一个名为foo的python变量,它的值是“bar”,我想这样使用它: foo = "bar" response.xpath('//*[contains(text(), foo)]') foo = "bar" response.xpath("//*[contains(text(), '" + foo + "')]") 但它返回所有元素!有什么问题吗?这个怎么办: foo = "bar" respo

我想选择它们的
文本
包含
的元素。我有一个名为
foo
的python变量,它的值是
“bar”
,我想这样使用它:

foo = "bar"
response.xpath('//*[contains(text(), foo)]')
foo = "bar"
response.xpath("//*[contains(text(), '" + foo + "')]")
但它返回所有元素!有什么问题吗?

这个怎么办:

foo = "bar"
response.xpath('//*[contains(text(), \''+foo+'\')]')
?您是否尝试过:

foo = "bar"
response.xpath('//*[contains(text(), "'+foo+'")]')
?

这是Mathiou的答案和
包含的
的正确XPath表达式的组合。不要忘记,即使在XPath表达式中,您也在处理一个字符串,您必须首先告诉它您有一个字符串。

关于你的问题:

但它返回所有元素!有什么问题

xpath查询返回“all”元素,因为xpath无法将字符串(
'/*[contains(text(),foo)]”
)中的“foo”识别为有效变量,因此它返回一个空节点集,而不是->这意味着它会检查哪些元素包含空字符串,基本上就是所有元素=)

解决方案 使用双引号和单引号对您有利,如下所示:

foo = "bar"
response.xpath('//*[contains(text(), foo)]')
foo = "bar"
response.xpath("//*[contains(text(), '" + foo + "')]")

它再次返回所有元素!如果xpath表达式中存在问题,您可能希望了解以下内容:可能在字符串前后使用
?但是如果需要其他选项,可以同时使用
,为什么要转义
)是的,这就是我在评论中提到的更正:)