2010-07-27 15 views
0

lxml donne erreur suivant la version 1.3 pour la ligne ci-dessous ..Problème de version lxml - impossible d'appeler la méthode 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 ([) 

Il fonctionne parfaitement sur la machine locale ayant lxml = 2.1.

ma question est ce qui est alternative pour elle, j'ai essayé de mettre à jour la version lxml du serveur, mais n'a pas réussi à le faire en tant que système d'exploitation est soufflant en rafales - ubuntu 7.10 related post

Répondre

3

prédicats dans les expressions ElementPath n'ont été ajoutées dans une version ultérieure. Le module original (c) ElementTree (inclus dans stdlib) ne l'a qu'à partir de la version 1.3 (dans stdlib python 2.7). Lxml a commencé à utiliser les expressions compatibles ElementTree 1.3 de la version 2.0 (quand ElementTree 1.3 était encore alpha)

La solution la plus simple: utilisez la méthode xpath(), qui peut utiliser des expressions xpath réelles au lieu du seul sous-ensemble supporté par ElementPath (le lxml faq explique pourquoi ils ont tous les deux xpath() et findall())

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

ou un filtre sur l'attribut vous-même (dans le cas où vous voulez quelque chose qui fonctionne avec le stdlib elementTree ainsi):

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