Python lxml xpath()函数不能与正确的xpath查询一起使用

Python lxml xpath()函数不能与正确的xpath查询一起使用,python,xpath,lxml,Python,Xpath,Lxml,我试图使用lxml库评估一些XPath查询,但是,出于某种原因,它似乎不起作用。这是密码 如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu': xml=r'' 包com.samples.e978092668; 它起作用并显示匹配。我不知道我自己的代码出了什么问题,因为,在很大程度上,我遵循了网站上的官方教程 编辑1: 尝试使用名称空间 xpath=''src:unit/src:class[(后代或self::src:decl_stmt/src:decl[(src:t

我试图使用lxml库评估一些XPath查询,但是,出于某种原因,它似乎不起作用。这是密码

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
xml=r''
包com.samples.e978092668;
它起作用并显示匹配。我不知道我自己的代码出了什么问题,因为,在很大程度上,我遵循了网站上的官方教程

编辑1:

尝试使用名称空间

xpath=''src:unit/src:class[(后代或self::src:decl_stmt/src:decl[(src:type[src:name[text()='JsonWebToken']]和src:annotation[src:name[text()='Inject']])和(src:annotation[src:name[text()='Path']]
tree=etree.fromstring(xml)
a=tree.xpath(xpath,名称空间={
“src”:http://www.srcML.org/srcML/src"
})
打印(len(a))#返回0(匹配项)

谢谢

问题是,当您这样做时:

tree=etree.fromstring(xml)
tree
具有上下文
src:unit
,因此您的xpath正在
src:unit
中查找子
src:unit
。(如果您
打印(tree.tag)
您将看到
{http://www.srcML.org/srcML/src}单位

尝试在
src:class
处启动xpath

xpath=''src:class[(后代或self::src:decl_stmt/src:decl[(src:type[src:name[text()='JsonWebToken']]和src:annotation[src:name[text()='Inject']])和(src:annotation[src:name[text()='Path']]]']

我测试了您的xpath。它缺少要使用的名称空间。看到这个答案:您的预期输出是什么?@SiebeJongebloed添加了名称空间,但仍然不起作用。@JackFleeting如果
print len(a)
返回0,则表示没有匹配项。预期输出为正值。请更新代码,在其中显示如何使用命名空间,以便我们可以帮助您。谢谢!是的,这符合你的建议。现在,我想知道是否有办法保持xpath不变,但将树上下文更改为更高的级别,以便
src:unit
也可以工作。通过查看XML,我发现
unit
无论如何都是最顶层的节点。但我只是好奇是否有可能为它创建一个伪根。不确定这是否有意义。@MansurGulami-这是有意义的。您可以尝试
tree=etree.ElementTree(etree.fromstring(xml))
tree=etree.parse(io.BytesIO(xml))
,但在这两种情况下,我都必须通过将
/
添加到开头(
/src:unit…
)来实现xpath的绝对化。