2015-06-24 60 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,並且在@shared_task內做了一個新的ET.fromstring(xml_string)。有了新的doc,所有的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)