【问题标题】:saving an 'lxml.etree._ElementTree' object保存“lxml.etree._ElementTree”对象
【发布时间】:2011-11-25 21:37:29
【问题描述】:

过去几天我一直在掌握 lxml 的基础知识;特别是使用 lxml.html 来解析网站并创建内容的 ElementTree。理想情况下,我想保存返回的 ElementTree,以便我可以加载它并进行试验,而不必每次修改我的脚本时都解析网站。我以为酸洗会是要走的路,但我现在开始怀疑了。虽然我能够在酸洗后检索 ElementTree 对象...

type(myObject) 

返回

<class 'lxml.etree._ElementTree'>

对象本身似乎是“空的”,因为我对其进行的后续方法/属性调用都不会产生任何输出。

我的猜测是酸洗在这里不合适,但有人可以提出替代方案吗?

(如果重要的话,上述情况发生在:python3.2、lxml 2.3.2、雪豹))

【问题讨论】:

    标签: python lxml pickle


    【解决方案1】:

    您已经在处理 XML,lxml 非常擅长解析 XML。所以我认为 最简单的做法是序列化为 XML:

    写入文件:

    import lxml.etree as ET
    
    filename = '/tmp/test.xml'
    myobject.write(filename)
    

    要调用write 方法,请注意myobject 必须是lxml.etree._ElementTree。如果它是一个 lxml.etree._Element,那么你需要 myobject.getroottree().write(filename).

    从文件名/路径、文件对象或 URL 解析:

    myobject = ET.parse(file_or_url)
    

    从字符串解析:

    myobject = ET.fromstring(content)
    

    【讨论】:

    • 感谢您的回复。不幸的是,我对 lxml、元素树等的理解非常粗略,以至于我实际上并不理解您提出的建议。这两天我努力翻阅lxml手册,但一无所获,所以我暂时离开这个项目。
    • 建议的写入方法让我在 python3 中出错,但从 'w' 更改为 'wb' 使它工作。
    【解决方案2】:

    lxml 是一个 C 库 - 准确地说是 libxml - 并且该对象可能不支持 python 酸洗或任何其他类型的序列化 - 除了将它们序列化为 XML。

    因此,我假设您要么必须将它们保存在内存中,要么重新解析所需的 XML 片段。

    【讨论】:

    • 确认pickle 返回'TypeError: can't pickle _Element objects'...这就是我发现这个问题的原因。
    【解决方案3】:

    我不相信你可以腌制 lxml 实例,但我所做的因为我处于类似情况,所以我腌制了可以构建树的对象实例。

    每个实例及其子实例都有一个构建元素树的函数。所以我会简单地腌制/缓存 Python 对象,从缓存中获取它,然后调用构建函数来获取我的元素树。

    【讨论】:

    • 谢谢巴泰克。正如我在上面的回复中提到的那样,很明显,我对元素树和 lxml 真的没有足够的知识来利用您的答案或此处发布的其他答案。也就是说,我至少已经证实了我的怀疑,即酸洗在这个例子中没有用。
    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多