【问题标题】:How to fix lxml assertion error如何修复lxml断言错误
【发布时间】:2015-04-10 21:08:01
【问题描述】:

我有一台运行 pythong.2.7.6 的 ubuntu 机器。当我尝试使用已使用pip 安装的 lxml 时,我收到以下错误:

Traceback (most recent call last):
  File "./export.py", line 44, in fetch_item
    root.append(elem)
  File "lxml.etree.pyx", line 742, in lxml.etree._Element.append     (src/lxml/lxml.etree.c:44339)
  File "apihelpers.pxi", line 24, in lxml.etree._assertValidNode     (src/lxml/lxml.etree.c:14127)
AssertionError: invalid Element proxy at 140443984439416

这是什么意思,我应该如何解决这个问题?

【问题讨论】:

  • 那么root.append(elem) 在你的代码中做了什么? elem 来自哪里?
  • 回溯告诉您,您尝试追加的任何内容都不是有效节点。因此,我们需要查看您的代码以确定您在此处尝试执行的操作以及如何解决此问题。
  • 您能回答上面@MartijnPieters 的问题吗?你使用multiprocessing 模块吗?

标签: python lxml


【解决方案1】:

我在multiprocessing 上下文中遇到了同样的问题。可以用下面的sn-p来说明:

from multiprocessing import Pool

import lxml.html


def process(html):
    tree = lxml.html.fromstring(html)
    body = tree.find('.//body')
    print(body)
    return body


def main():
    pool = Pool()
    result = pool.apply(process, ('<html><body/></html>',))
    print(type(result))
    print(result)  


if __name__ == '__main__':
    main()

运行结果如下:

<Element body at 0x7f9f690461d8>
<class 'lxml.html.HtmlElement'>
Traceback (most recent call last):
  File "test.py", line 18, in <module>
    main()
  File "test.py", line 14, in main
    print(result)
  File "src/lxml/lxml.etree.pyx", line 1142, in lxml.etree._Element.__repr__ (src/lxml/lxml.etree.c:54748)
  File "src/lxml/lxml.etree.pyx", line 992, in lxml.etree._Element.tag.__get__ (src/lxml/lxml.etree.c:53182)
  File "src/lxml/apihelpers.pxi", line 19, in lxml.etree._assertValidNode (src/lxml/lxml.etree.c:16856)
AssertionError: invalid Element proxy at 139697870845496

因此,考虑到__repr__ 在工作进程中工作并且返回值可用于调用进程,因此最明显的解释是反序列化问题。例如,可以通过返回lxml.html.tostring(body) 或任何其他pickle-able 对象来解决它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 2018-02-20
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多