BeautifulSoup对象不会腌制,导致解释器无声崩溃

时间:2014-07-03 20:53:10

标签: python beautifulsoup pickle

我有来自BeautifulSoup的汤,我无法腌制。当我尝试pickle对象时,python解释器默默地崩溃(这样它就不能作为例外处理)。我必须能够使用multiprocessing包(用于在对象之间传递它们来腌制对象)来挑选对象以返回对象。我该如何解决/解决问题?不幸的是,我无法发布该页面的html(它不公开),我一直无法找到问题的可重现的例子。我试图通过循环汤和酸洗单个组件来隔离问题,产生错误的最小的东西是<class 'BeautifulSoup.NavigableString'>。当我打印对象时,它打印出u'\n'

3 个答案:

答案 0 :(得分:5)

NavigableString类使用的picklecPickle无法序列化multiprocessing。但是,您应该可以使用dill序列化此类。 dill具有pickle接口的超集,可以序列化大部分python。 multiprocessing仍然会失败,除非您使用multiprocessing使用dill的{​​{1}}分叉,名为pathos.multiprocessing

在此处获取代码:https://github.com/uqfoundation


有关更多信息,请参阅: What can multiprocessing and dill do together?

http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/

http://nbviewer.ipython.org/gist/minrk/5241793

答案 1 :(得分:2)

如果您不需要漂亮的汤对象本身,但汤的某些产品,即文本字符串,您可以在酸洗之前从较大的对象中删除BeautifulSoup属性,方法是将以下代码添加到类定义中:

class MyObject(MyObject):

    def __getstate__(self):
        for item in dir(self):
            item_type = str(type(getattr(self, item)))
            if 'BeautifulSoup' in itype:
                delattr(self, item)

        return self.__dict__

答案 2 :(得分:1)

事实上,正如dekomote所建议的那样,你只需要采取一种优势,即你可以将汤转换为unicode字符串,然后再将unicode字符串转回汤中。

所以恕我直言,你不应该尝试通过多处理包传递汤对象,而只是代表汤的字符串。