2015-06-24 2 views
3

У меня есть сеанс в экземпляре, запущенном ZODB, который анализирует страницу и затем сохраняет объект lxml. Позже броски:lxml AssertionError: invalid Прокси-сервер

AssertionError: invalid Element proxy at 4495778632 

Это не легко воспроизвести в моем конкретном случае, но этот код также делает это:

from lxml import etree 
tree = etree.fromstring("<html><body>test</body></html>" , etree.HTMLParser()) 
c=[ x for x in tree.iter() ][0] 
print(c.__class__())  

Что происходит?

ответ

4

У меня этот AssertionError, когда я пытался выполнять операции над узлом элемента, который я передал в качестве аргумента для сельдерея @shared_task на его вызов .delay. Чтобы исправить ошибку, а не передавать в элементе, я прошел в xml_string и сделал новый ET.fromstring(xml_string) в пределах @shared_task. С новым документом все операции etree работали нормально. Должно быть, это было связано с сериализацией Элемента, когда он попадал в очереди сельдерея.

1

В сообщении об ошибке указано, что прокси-сервера элемента не существует. Прокси-сервер означает соответствующее представление узла, отсутствующего в списке C.

С помощью c.__class__() вы пытаетесь вызвать конструктор класса _Element. Документация LXML говорит:

It is important to know that every proxy in lxml has a factory function that properly sets up C level members. Proxy objects must never be instantiated outside of that factory. For example, to instantiate an _Element object or its subclasses, you must always call its factory function::

cdef xmlNode* c_node 
cdef _Document doc 
cdef _Element element 
... 
element = _elementFactory(doc, c_node) 

без использования шаблона фабрики и передавая c_node, конструктор потерпит неудачу из-за утверждений:

LXML/SRC/LXML/apihelpers.pxi:

cdef inline int _assertValidNode(_Element element) except -1: 
    assert element._c_node is not NULL, u"invalid Element proxy at %s" % id(element)