所以我有一个使用BeautifulSoup检索数据的方法。它能够存储和附加从字典中收集的数据;但是,当我尝试打印列表以检查数据时;它返回为
空{}
示例代码
main_link = 'Sample Link'
def_list = []
def_dict = {}
def retrieve_from(ml):
#some code
scrap_data = retrieve_from(main_links)
def MethodA(className, url_link):
try:
for div_tag in url_link.find_all('div'):
div_text = div_tag.find('div', {'class': className})
if div_text :
def_dict = {
'Description': div_text.text.replace("\n", "")}
def_list.append(def_dict )
return def_dict
except:
def_dict = None
该方法检索数据没有问题,因为它打印在列表中;当我在命令中打印def_list
时:
{'Description': 'a'},
{'Description': 'b'},
{'Description': 'c'}
我已尝试参考以下内容;但是要利用它并不能真正解决我遇到的问题。
我试图
my_dict = list(def_dict.keys())
pprint(my_dict)
但仍然返回{},我是否指向未定义列表?
答案 0 :(得分:1)
评论中的jasonharper对这个问题是正确的,LearningNoob基本上有一个正确的解决方案(稍作调整),但是我认为值得一提来提供整个图片。
def_list
是在外部范围中定义的列表,用于保存def_dict
字典。
def_dict
的定义如下:尚不明确这是什么意思,但是在MethodA
中我们可以看到def_dict
似乎是一个带有{{1 }}键,其值基于特定类的Description
元素中的文本。
在<div>
内,我们使用一系列方法来查找满足特定条件的MethodA
。找到一个后,我们创建一个新的<div>
:
def_dict
因为我们要在内部范围内分配变量def_dict = {'Description': div_text.text.replace("\n", "")}
,所以这个新对象(用def_dict
初始化)实际上要优先于外部范围中定义的{}
:内存中有两个字典实例-在外部作用域中,初始的空字典实例仍分配给def_dict
,而在内部作用域def_dict
中现在引用字典def_dict
。
因此,第二个实例被附加到{'Description': div_text.text.replace("\n", "")}
。由于def_list
尚未在内部范围内分配给它,因此它仍然是我们在外部范围内初始化的列表实例。
当我们回到外部范围时,我们发现在这些范围中对def_list
和def_list
的引用从未改变,但是def_dict
仍然具有对所有{我们在def_list
中创建的{1}}个实例。因此,def_list
打印出我们运行MethodA
时初始化的def_list
的列表,而def_dict
打印为空(因为没有添加任何内容)。
据我所知,没有理由确定(MethodA
可以初始化的def_dict
无限个def_dict
中的哪个def_dicts
在外部作用域中被MethodA
引用,所以我不确定def_dict
返回空还是返回def_dict
的任意成员与之相关的原因。>
谈到LearningNoob的解决方案返回def_list
的原因,很可能是因为以下几行:
None
在def MethodA(className, url_link):
try:
for div_tag in url_link.find_all('div'):
[etc]
return def_dict
except:
def_dict = None
的{{1}}迭代期间,它大概在某个时候失败了。发生这种情况时,将调用MethodA
子句,并隐式返回for div_tag in url_link:
。因此,如果您选择以下任一方法:
except
结果将为None
。
答案 1 :(得分:0)
尝试一下
main_link = 'Sample Link'
def_list = []
def_dict = {}
def retrieve_from(ml):
#some code
scrap_data = retrieve_from(main_links)
def MethodA(className, url_link):
try:
for div_tag in url_link.find_all('div'):
div_text = div_tag.find('div', {'class': className})
if div_text :
def_dict['Description'] = div_text.text.replace("\n", "")
def_list.append(def_dict )
return def_dict
except:
def_dict = None
答案 2 :(得分:0)
尝试返回列表而不是字典?
def MethodA(className, url_link):
try:
for div_tag in url_link.find_all('div'):
div_text = div_tag.find('div', {'class': className})
if div_text :
def_dict['Description'] = div_text.text.replace("\n", "")
def_list.append(def_dict )
return def_list #instead of def_dict?
except:
def_dict = None