在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表达式中存在问题,您可能希望了解以下内容:可能在字符串前后使用”
?但是如果需要其他选项,可以同时使用“
,为什么要转义”
)是的,这就是我在评论中提到的更正:)