字典返回空值;但它仍然存储在列表中

时间:2018-12-19 03:57:37

标签: python list dictionary beautifulsoup

所以我有一个使用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) 

但仍然返回{},我是否指向未定义列表?

3 个答案:

答案 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_listdef_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