保存'lxml.etree._ElementTree'对象

时间:2011-11-25 21:37:29

标签: python lxml pickle

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

type(myObject) 

返回

<class 'lxml.etree._ElementTree'>

对象本身似乎是“空的”,因为我对它做的后续方法/属性调用都没有产生任何输出。

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

(如果重要,以上情况发生在:python3.2,lxml 2.3.2,snow-leopard))

3 个答案:

答案 0 :(得分:19)

您已经在处理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)

答案 1 :(得分:13)

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

所以你要么必须将它们保存在内存中,要么重新解析你需要的XML片段,我认为。

答案 2 :(得分:3)

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

每个实例及其子实例都具有构建Element树的功能。所以我只是简单地挑选/缓存Python对象,从缓存中获取它,然后调用构建函数来获取我的元素树。

相关问题