lxml在以下行的版本1.3上给出以下错误..
self.doc.findall('.//field[@on_change]')
File "/home/.../code_generator/xmlGenerator.py", line 158, in processOnChange
onchangeNodes = self.doc.findall('.//field[@on_change]')
File "etree.pyx", line 1042, in etree._Element.findall
File "/usr/lib/python2.5/site-packages/lxml/_elementpath.py", line 193, in findall
return _compile(path).findall(element)
File "/usr/lib/python2.5/site-packages/lxml/_elementpath.py", line 171, in _compile
p = Path(path)
File "/usr/lib/python2.5/site-packages/lxml/_elementpath.py", line 88, in __init__
"expected path separator (%s)" % (op or tag)
SyntaxError: expected path separator ([)
它在lxml = 2.1的本地机器上完美运行。
我的问题是它的替代方案,我试图更新服务器的lxml版本,但由于操作系统很狂热而无法做到这一点 - ubuntu 7.10 related post
答案 0 :(得分:3)
ElementPath表达式中的谓词仅在更高版本中添加。原始的(c)ElementTree模块(包含在stdlib中)仅具有版本1.3(在stdlib python 2.7中)。我认为Lxml开始使用版本2.0中的ElementTree 1.3兼容表达式(当ElementTree 1.3仍然是alpha时)
最简单的解决方案:使用xpath()
方法,该方法可以使用真正的xpath表达式而不仅仅是ElementPath支持的子集(lxml faq解释了为什么它们同时拥有xpath()
和{ {1}})
findall()
或自己过滤属性(如果你想要的东西也适用于stdlib ElementTree):
self.doc.xpath('.//field[@on_change]')