【问题标题】:Best way to deal with "key error" when scraping (yahoo finance)?抓取时处理“关键错误”的最佳方法(雅虎财经)?
【发布时间】:2025-12-05 13:00:01
【问题描述】:

您好,我正在为 yahoo Finance 进行抓取,我正在使用 JSON 获取密钥,然后抓取密钥,例如 ...

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

错误在于,如果公司不支付股息,则会产生一个关键错误,因为没有关键的“raw”而不是使用 raw = 0,他们只是没有 raw。但是,如果一家公司确实有股息,它将返回“raw”、“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

【问题讨论】:

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


    【解决方案1】:

    要从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]
    

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

    【讨论】:

      【解决方案2】:

      我会将检查公司是否支付股息的任何代码封装在 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']}")
      

      【讨论】:

      • 感谢第二个问题,它主要针对那个特定项目,它返回两个原始文件和两个 fmts 我问的是有没有办法在一行代码中提取两个 fmts 而不是像上面那样单独拆分它们在我的示例中,然后创建一个新变量,包括拆分它的前两个变量
      • 你能用data 的例子更新你的问题吗?似乎data...['earningsDate'] 是 {'raw': ...'fmt': ... }` 的列表,可以使用与我的第一个建议非常相似的方法,而不是支付股息的公司列表,它是 @987654328每个公司的@列表。
      最近更新 更多