2010-07-27 48 views
0

LXML给出了1.3版本,下面的线下面的错误..lxml版本问题 - 无法调用fndall方法!

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

回答

3

谓词ElementPath表达;在以后的版本只增加。原来的(c)ElementTree模块(包含在stdlib中)只有1.3版本(在stdlib python 2.7中)。 LXML使用上,我认为(在ElementTree的1.3仍然阿尔法)从2.0版本的ElementTree 1.3兼容的表情开始

最简单的解决办法:使用xpath()方法,该方法可以使用,而不是只子集真正的XPath表达式ElementPath支持(该lxml faq解释了为什么他们有两个xpath()findall())的属性自己

self.doc.xpath('.//field[@on_change]') 

或过滤器(如果你想要的东西,与STDLIB ElementTree的协同工作):

[i for i in self.doc.findall('.//field') if i.get('on_change') is not None]