Проблема с версией lxml - невозможно вызвать метод fndall! - PullRequest
0 голосов
/ 27 июля 2010

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 соответствующий пост

1 Ответ

3 голосов
/ 27 июля 2010

Предикаты в выражениях 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]
...