gpt4 book ai didi

python - 在搁置中保存 lxml 元素时出现类型错误

转载 作者:行者123 更新时间:2023-12-01 04:51:16 27 4
gpt4 key购买 nike

我正在处理一些 xml 文件。
pb_id是一个字符串。
page_elements是一个列表。

pb_id = x.xpath('//pb/@xml:id')[0]
page_elements = x.xpath('//@xml:id[preceding::pb]')

我想将这些值保存在搁置缓存中:

s = shelve.open('cache.shelve')
s[str(pb_id)] = page_elements

但它返回此错误:

can't pickle _Element objects

我需要转换page_elements其他类型?
type(page_elements)<type 'list'>

最佳答案

只有可挑选的数据类型才能存储在架子中 - 特别是,由 C 扩展添加的类型需要显式支持才能可挑选;截至目前,lxml 尚未编写该支持。

除非您愿意为上游 lxml 提供补丁并通过合并和发布来引导它,否则我建议您重新审视您的需求:为什么要尝试存储有问题的数据?您能否以不同的方式序列化内容(例如,序列化为 XML 文本——即使该文本随后被搁置),并在加载时反序列化它?

如果您将 XML 元素封装在您控制的数据结构中,则可以覆盖 __getstate__()__setstate__() 以适本地序列化和反序列化;阅读the pickle library documentation了解详情。

你最终可能会得到这样的结果:

class PicklablePage(object):
def __init__(self, page_elements=None):
self.page_elements = page_elements or []
def __getstate__(self):
return {'page_elements': [ lxml.etree.tostring(el)
for el in self.page_elements ]}
def __setstate__(self, state):
self.page_elements = [ lxml.etree.fromstring(el_text)
for el_text in state['page_elements'] ]

然后可以安全地 pickle 和取消 pickle (从而搁置和取消搁置):

>>> el = lxml.etree.fromstring('<content>Hello</content>')
>>> p = PicklablePage([el])
>>> print pickle.loads(pickle.dumps(p)).page_elements[0].text
Hello

关于python - 在搁置中保存 lxml 元素时出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28414489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com