我要编写的函数遇到了一些麻烦。应该做的是: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
行的后面来解决这个问题。
我应该更改什么以使列表(以及相应的字典)按计划形成?
答案 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']
来获取金融部门的股息收益率)来访问数据。