__new __()缺少1个必需的位置参数,具体取决于所抓取的网址

时间:2018-08-17 12:30:44

标签: python beautifulsoup pickle

我有一个奇怪的错误,我将尝试简化我的问题。 我有一个简单的函数,用漂亮的汤抓取网址并返回列表。 然后,我将列表中的文件腌制,所以我 setrecursionlimit(10000)以避免 RecursionError 。到那为止,一切都很好。

但是当我尝试取消列表访问权限时,出现此错误:

Traceback (most recent call last):
  File ".\scrap_index.py", line 86, in <module>
    data_file = pickle.load(data)
TypeError: __new__() missing 1 required positional argument: 'name'

有我的功能

import urllib.request
from bs4 import BeautifulSoup

def scrap_function(url):
    page = urllib.request.urlopen(url)
    soup = BeautifulSoup(page, "html5lib")   

    return [soup]

为了进行测试,我尝试了其他网址。 使用该网址,一切都很好:

url_ok = 'https://www.boursorama.com/bourse/'

但是有了那个,我有TypeError:

url_not_ok = 'https://www.boursorama.com/bourse/actions'

和测试代码:

import pickle
import sys

sys.setrecursionlimit(10000)

scrap_list = scrap_function(url_not_ok)

with open('test_saving.pkl', 'wb') as data:
    pickle.dump(scrap_list, data, protocol=2)

with open('test_saving.pkl', 'rb') as data:
    data_file = pickle.load(data)

print(data_file)

1 个答案:

答案 0 :(得分:1)

This状态

  

如果某些类对象在 new 构造函数中具有其他参数   ,泡菜无法序列化。

这可能导致beautifulsoap中的问题here

class NavigableString(unicode, PageElement):
    def __new__(cls, value):

This answer声明相同。

作为解决方案,不存储整个对象,而可能只存储页面的源代码,如here所述。