【问题标题】:XPath invalid expression when tag name has curly braces标记名称带有花括号时的 XPath 表达式无效
【发布时间】:2014-06-27 21:48:03
【问题描述】:

我要访问的标签名称是{http://whitehatsec.com/XML-api-Vuln}description。方便地,每个标签都以对白帽网站的可爱引用作为前缀。不幸的是,lxml 中的 xpath 不喜欢它。我目前正在尝试vuln_root[0].xpath('//\{http://whitehatsec.com/XML-api-Vuln\}description'),这应该可以让我找到正确的节点。但是lxml一直在说

File "test.py", line 23, in <module> for s in vuln_root[0].xpath('//\{http://whitehatsec.com/XML-api-Vuln\}description'): File "lxml.etree.pyx", line 1509, in lxml.etree._Element.xpath (src/lxml/lxml.etree.c:50725) File "xpath.pxi", line 318, in lxml.etree.XPathElementEvaluator.__call__ (src/lxml/lxml.etree.c:146020) File "xpath.pxi", line 238, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:145028) File "xpath.pxi", line 224, in lxml.etree._XPathEvaluatorBase._raise_eval_error (src/lxml/lxml.etree.c:144883) lxml.etree.XPathEvalError: Invalid expression

如何在我的 xpath 中绕过这个糟糕的标签命名?谢谢

【问题讨论】:

  • {namespace-uri}element-name 是编写包含其命名空间的元素名称的一种方法(有时您还会看到这些在左大括号之前带有前导 Q)。当您有 xmlns:ns-prefix='namespace-uri' 声明时,它与 ns-prefix:element-name 相同。
  • 更多背景知识:“这是一项功能,而不是错误!” -- XML 名称空间让人们构建复合文档而不用担心冲突……因此您可以构建一个包含 XHTML 或 XForms 或其他任何内容以及白帽数据的文档,而不必担心任何标签名称是否相互冲突。将 XML 模板/宏语言与其他文档类型结合起来非常有用,因为命名空间会告诉您较大文档的编辑工具,标记内容是外来数据,应该不理会。​​span>

标签: python xml xpath lxml


【解决方案1】:

这里最简单的方法是映射命名空间。

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

【讨论】:

  • 漏洞需要在其周围使用 {}。这仍然有效吗?
  • 不,它不需要{}。花括号是 QName 语法的一部分。
  • 好的,我明白了。当标签名称包含这些时,我只是感到困惑。我对 xpath 不是很熟悉。顺便说一句,它起作用了。最初键入的命名空间没有最后一个 s。感谢您的帮助!
  • 不是严格意义上的 XPath 东西,顺便说一下——在涉及 XML 命名空间的许多其他上下文中,您也会看到相同的符号。
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 2011-11-21
  • 2015-03-17
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多