我花了几天的时间来掌握lxml的基础知识;特别是使用lxml.html来解析网站并创建内容的ElementTree。理想情况下,我想保存返回的ElementTree,以便我可以加载它并进行实验,而不必在每次修改脚本时解析网站。我认为酸洗是要走的路,但我现在开始怀疑。虽然我可以在酸洗后检索一个ElementTree对象......
type(myObject)
返回
<class 'lxml.etree._ElementTree'>
对象本身似乎是“空的”,因为我对它做的后续方法/属性调用都没有产生任何输出。
我的猜测是酸洗在这里不合适,但任何人都可以提出替代方案吗?
(如果重要,以上情况发生在:python3.2,lxml 2.3.2,snow-leopard))
答案 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对象,从缓存中获取它,然后调用构建函数来获取我的元素树。