Python 标记名带有大括号时XPath表达式无效

Python 标记名带有大括号时XPath表达式无效,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,我试图访问的标记的名称是{http://whitehatsec.com/XML-api-Vuln}说明。方便的是,每一个标签的前缀都是对whitehat网站的可爱引用。不幸的是lxml中的xpath不喜欢它。我当前正在尝试vuln\u root[0]//\{http://whitehatsec.com/XML-api-Vuln\}description')这会让我找到正确的节点。然而,lxml一直在说 文件“test.py”,第23行,在 用于vuln_根[0]中的s。xpath('//\{h

我试图访问的标记的名称是
{http://whitehatsec.com/XML-api-Vuln}说明
。方便的是,每一个标签的前缀都是对whitehat网站的可爱引用。不幸的是
lxml
中的
xpath
不喜欢它。我当前正在尝试
vuln\u root[0]//\{http://whitehatsec.com/XML-api-Vuln\}description')
这会让我找到正确的节点。然而,lxml一直在说


文件“test.py”,第23行,在
用于vuln_根[0]中的s。xpath('//\{http://whitehatsec.com/XML-api-Vuln\}说明):
lxml.etree.\u Element.xpath(src/lxml/lxml.etree.c:50725)中第1509行的文件“lxml.etree.pyx”
文件“xpath.pxi”,第318行,位于lxml.etree.XPathElementEvaluator.调用(src/lxml/lxml.etree.c:14602)
文件“xpath.pxi”,第238行,在lxml.etree.\u xpatheevaluorbase.\u handle\u result(src/lxml/lxml.etree.c:145028)中
文件“xpath.pxi”,第224行,位于lxml.etree.\u xpatheevaluorbase.\u raise\u eval\u error(src/lxml/lxml.etree.c:144883)
lxml.etree.xpathevaleror:表达式无效


如何在xpath中避免这种糟糕的标记命名?谢谢

这里最简单的方法就是映射名称空间

el.xpath('//vuln:description',
    namespaces={'vuln': 'http://whitehatsec.com/XML-api-Vuln'})

vuln需要它周围的{}。这仍然有效吗?不,它周围不需要
{}
。大括号是QName语法的一部分。当标签名包含这些时,我只是感到困惑。我对xpath不是非常熟悉。顺便说一句,它起作用了。最初键入的名称空间没有最后的s。谢谢你的帮助!顺便说一句,这并不是严格意义上的XPath——在许多其他涉及XML名称空间的上下文中也会看到相同的符号。
{namespace uri}element name
是编写包含其名称空间的元素名称的一种方法(有时,在开始的大括号之前,您还会看到前面有一个前导的
Q
)。当您有一个
xmlns:ns prefix='namespace-uri'
声明时,它与
ns prefix:element name
相同。更详细的背景信息:“这是一个功能,不是一个bug!”--XML命名空间让人们构建复合文档而不必担心冲突。。。因此,您可以构建一个既包含XHTML或XForms,又包含whitehat数据的文档,而不必担心任何标记名是否相互冲突。将XML模板/宏语言与其他文档类型相结合非常有用,因为名称空间告诉较大文档的编辑工具,标记内容是外来数据,应该单独使用。