【发布时间】: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。