【问题标题】:"lxml.etree.XPathEvalError: Invalid expression" with Unicode element names带有 Unicode 元素名称的“lxml.etree.XPathEvalError: Invalid expression”
【发布时间】:2015-06-23 16:58:26
【问题描述】:

lxml 很好地支持 Unicode 元素名称,因为它们根据 XML 规范是有效的。但是在 XPath 中使用 Unicode 会产生错误:

>>> import lxml.etree
>>> e = lxml.etree.fromstring('<?xml version="1.0" encoding="UTF-8"?><элемент>текст</элемент>'.encode('utf-8'))
>>> e.xpath('/элемент/text()')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 1509, in lxml.etree._Element.xpath (src/lxml/lxml.etree.c:50702)
  File "xpath.pxi", line 318, in lxml.etree.XPathElementEvaluator.__call__ (src/lxml/lxml.etree.c:145954)
  File "xpath.pxi", line 238, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:144962)
  File "xpath.pxi", line 224, in lxml.etree._XPathEvaluatorBase._raise_eval_error (src/lxml/lxml.etree.c:144817)
lxml.etree.XPathEvalError: Invalid expression

这是一个 lxml 限制吗?我在文档中找不到它,但也许我错过了。

有人可以解释这背后的原因吗?


更新: 仅当 XPath 的第二个字符是 Cyrillic 时才会出现问题。它适用于:
  • //элемент这样的相对路径

  • 第一个英文字母的路径,如//qлемент

  • /./элемент 而不是/элемент(它们是等价的)

而且,这似乎是libxml2 的问题,而不仅仅是lxml 的问题。

$ xmlstarlet sel -t -v "/элемент/text()" test.xml 
Invalid expression: /элемент/text()
compilation error: element with-param
XSLT-with-param: Failed to compile select expression '/элемент/text()'
$ xmlstarlet sel -t -v "/./элемент/text()" test.xml 
текст

我放弃了这个问题,转而使用/./ 获取带有西里尔文标签的绝对 XPath。

【问题讨论】:

  • Python 2 还是 3?如果是 Python 2,您可能需要将 Unicode 字符串传递给 xpath

标签: python xpath unicode lxml


【解决方案1】:

如果引用根节点,您的 XPath 缺少 /

>>> e.xpath('//элемент/text()')
['текст']

或者两个点..如果指的是相对父节点:

>>> e.xpath('../элемент/text()')
['текст']

【讨论】:

  • 并非如此。仅当 XPath 的第二个字符是 Cyrillic 时才会出现问题。与英文标签或您的示例中的相对路径一起工作正常。
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多