字典正在返回空值;但它仍存储在lis中

2024-05-29 03:46:14 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一个使用BeautifulSoup检索数据的方法;它能够存储和附加从字典收集的数据;但是,当我试图打印列表以检查数据时,它返回

Empty { }

样本代码

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) 

但仍然返回{},我是否指向未定义的列表?你知道吗


Tags: 数据方法textfromdivurl列表main
3条回答

试试这个

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

评论中的jasonharper对这个问题的看法是正确的,LearningNoob基本上有一个正确的解决方案(稍加调整),但我认为值得发布它来提供整个情况。你知道吗

def_list是在外部作用域中定义的列表,用于保存def_dict词典。 def_dict是在它下面定义的:现在还不清楚这是用来做什么的,但是在MethodA中,我们可以看到def_dict似乎是一个带有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_listdef_dict的引用在这些作用域中从未更改,但是def_list仍然引用我们在MethodA中创建的所有def_list实例。因此,def_list打印在运行MethodA时初始化的def_dict列表,def_dict打印为空(因为从未向其中添加任何内容)。你知道吗

就目前的情况而言,据我所知,没有理由确定哪些def_dict(在MethodA可以初始化的def_dicts的无限数中)应该被外部范围中的def_dict引用,所以我不确定为什么def_dict返回空的还是返回def_list的任意成员相关。你知道吗


谈到LearningNoob的解决方案返回None的原因,很可能是因为这里的这些行:

def MethodA(className, url_link):
    try:
        for div_tag in url_link.find_all('div'):
            [etc]
        return def_dict
    except:
        def_dict = None

MethodAfor div_tag in url_link:迭代过程中,它可能会在某个点失败。发生这种情况时,将调用except子句,并隐式返回None。因此,如果您这样做:

def_list = MethodA(*args,**kw)
## or
print(MethodA(*args,**kw))

结果将是None。你知道吗

尝试返回列表而不是字典?你知道吗

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

相关问题 更多 >

    热门问题