抓取时处理“关键错误”的最佳方法(雅虎财务)?

时间:2020-06-16 16:10:58

标签: json python-3.x web-scraping

嗨,我正在为Yahoo Finance进行抓取工作,我正在使用JSON获取密钥,然后抓取密钥,例如...

fwd_div_yield = data['context']['dispatcher']['stores']['QuoteSummaryStore']["summaryDetail"]['dividendYield']['raw']

错误是,如果公司不支付股息,则会产生关键错误,因为没有关键的“原始”,而不是使用raw = 0,它们只是没有原始的。但是,如果公司确实有股息,它将返回“原始”,“ fmt”等。

我想知道最有效的处理方式是什么?

另一个问题是您将如何访问...

[{'raw': 1595894400, 'fmt': '2020-07-28'}, {'raw': 1596412800, 'fmt': '2020-08-03'}]

我目前的求助是...

earnings_dates = data['context']['dispatcher']['stores']['QuoteSummaryStore']['calendarEvents']['earnings']['earningsDate'][0]['fmt']

earnings_datee = data['context']['dispatcher']['stores']['QuoteSummaryStore']['calendarEvents']['earnings']['earningsDate'][1]['fmt']

earnings_date = earnings_dates+", "+earnings_datee

2 个答案:

答案 0 :(得分:2)

要从raw键中提取股息收益率,而在没有KeyError时不得到收益,请执行以下操作:

fwd_div_yield = data['context']['dispatcher']['stores']['QuoteSummaryStore']["summaryDetail"]['dividendYield'].get('raw', 0)

如果raw不存在,则fwd_div_yield将为0。

然后从字典列表中检索每个日期,您可以使用列表理解:

earnings_dates = data['context']['dispatcher']['stores']['QuoteSummaryStore']['calendarEvents']['earnings']['earningsDate']
fmt_dates = [date['fmt'] for date in earnings_dates]

此外,该数据可通过以下网址获得:https://query2.finance.yahoo.com/v10/finance/quoteSummary/aapl?modules=summaryDetail。只需将aapl替换为要抓取的符号即可。

答案 1 :(得分:0)

我会用任何代码包装要检查的公司是否在try/except块中派发股息。

def paysDivivend(data):
    try:
        if 'raw' in data:
        return True
    except KeyError:
        return False

没有看到任何示例代码,这是一种快速解决方案

第二个问题...

如果,您要创建[{'raw': 1234,'fmt':'2020-07-28'},...]

基于支付股息的公司汇总列表。 创建列表:

def dividendList(data):
    dividend_list = []
    for company in data:
        dividend_list.append({'raw':compay['path']['to']['raw'],'fmt':company['path']['to'][fmt']})
    return dividend_list

如果,则您在创建列表后尝试访问每个列表:

def accessDividend(dividend_data):
    for dividend in dividend_data:
        print(f"{dividend['raw']}, {dividend['fmt']}")