如何在不覆盖数据的情况下将字典添加到列表

时间:2020-04-01 08:26:55

标签: python

我要编写的函数遇到了一些麻烦。应该做的是:1)转到特定的URL,并获取存储在特定div中的金融部门的列表; 2)访问每个部门的相应页面,并从那里获取3条特定信息; 3)将收集到的集合放入字典中;和4)将该字典追加到另一本字典。

所需的输出是一个字典,其中包含所有扇区的字典列表。

这是我的功能:

def fsr():
    fidelity_sector_report = dict()
    url = "https://eresearch.fidelity.com/eresearch/goto/markets_sectors/landing.jhtml"
    
    import requests
    from bs4 import BeautifulSoup
    
    # scrape the url page and locate links for each sector
    try:
        response = requests.get(url)
        if not response.status_code == 200:
            return 'Main page error'
        page = BeautifulSoup(response.content, "lxml")
        
        sectors = page.find_all('a',class_="heading1")
        for sector in sectors:
            link = 'https://eresearch.fidelity.com/' + sector['href']
            name = sector.text
            sect = dict()
            lst = []
            
            # scrape target pages for required information
            try:
                details = requests.get(link)
                if not details.status_code == 200:
                    return 'Details page error'
                details_soup = BeautifulSoup(details.content,'lxml')
                
                fundamentals = details_soup.find('div',class_='sec-fundamentals')
                values = dict()
                
                #locate required values by addressing <tr> text and put them in a dictionary
                values['Enterprise Value'] = fundamentals.select_one('th:contains("Enterprise Value") + td').text.strip()
                values['Return on Equity (TTM)'] = fundamentals.select_one('th:contains("Return on Equity (TTM)") + td').text.strip()
                values['Dividend Yield'] = fundamentals.select_one('th:contains("Dividend Yield") + td').text.strip()
                
                #add values to the sector dictionary
                sect[name] = values
                
                # add the dictionary to the list
                lst.append(dict(sect))
                
                # for a dictionary using the list
                fidelity_sector_report['results'] = lst
            except:
                return 'Something is wrong with details request'
            
        return fidelity_sector_report
    except:
        return "Something is horribly wrong"
据我所知,它很好地执行了主要任务,并且问题出现在将已形成的字典添加到列表的阶段-而不是添加新的字典,它被完全覆盖。我通过将print(lst)放在fidelity_sector_report['results'] = lst行的后面来解决这个问题。

我应该更改什么以使列表(以及相应的字典)按计划形成?

2 个答案:

答案 0 :(得分:2)

您应将lst=[]移到扇区循环之外。 出现问题的原因是,对于每个扇区,您都重置了lst并将当前扇区数据附加到一个空列表中。

答案 1 :(得分:0)

以下代码将fidelity_sector_report['results']的值替换为lst

fidelity_sector_report['results'] = lst

我假设您想使用一个键来访问各个值,您可以在fidelity_sector_report = dict()下添加以下行来初始化字典:

fidelity_sector_report['results'] = {}

然后,使用扇区名称为每个扇区创建一个密钥,并通过将values替换为您的fidelity_sector_report['results'] = lst字典来设置值:

fidelity_sector_report['results'][name] = dict(values)

您可以使用相关键(即fidelity_sector_report['results']['Financials']['Dividend Yield']来获取金融部门的股息收益率)来访问数据。