如何用异常处理yfinance的HTTPError以继续遍历股票列表?
解决yfinance股票数据获取时的异常处理问题
问题场景
遍历股票列表获取行业信息时,遇到无法获取数据的股票(如'FB'),尝试异常处理但失败,出现两种错误:
- 未捕获到
HTTPError,直接抛出404错误 - 引用
yf.utils.exceptions.HTTPError导致AttributeError,因为该模块不存在
原代码:
stcks = ['AXSM', 'FB', 'AAPL'] for i in stcks: try: sec = yf.Ticker(i).info['sector'] except yf.utils.exceptions.HTTPError as err: print('error') continue else: print('hi')
执行时的错误输出:
hi HTTPError: 404 Client Error: Not Found for url: https://query2.finance.yahoo.com/v10/finance/quoteSummary/FB?modules=summaryProfile%2CfinancialData%2CquoteType%2CdefaultKeyStatistics%2CassetProfile%2CsummaryDetail&ssl=true
修改异常引用后出现的错误:
AttributeError Traceback (most recent call last) Cell In[243], line 5 3 try : 4 sec = yf.Ticker(i).info['sector'] ----> 5 except yf.utils.exceptions.HTTPError as err: 6 print('error') 7 continue AttributeError: module 'yfinance.utils' has no attribute 'exceptions'
问题原因
- yfinance底层依赖
requests库发送请求,抛出的HTTPError实际来自requests.exceptions,而非yf.utils.exceptions - 当股票数据获取失败时,
yf.Ticker(i).info可能返回空字典,此时访问['sector']会抛出KeyError,同样需要捕获
解决方案
捕获正确的异常类型,同时处理可能的空数据情况,确保遍历能继续执行:
import yfinance as yf import requests stcks = ['AXSM', 'FB', 'AAPL'] for stock in stcks: try: ticker = yf.Ticker(stock) info = ticker.info # 先校验数据是否有效 if not info: raise ValueError("未获取到有效数据") sec = info['sector'] except (requests.exceptions.HTTPError, KeyError, ValueError) as err: print(f"股票{stock}数据获取失败: {err}") continue else: print('hi')
说明
- 捕获
requests.exceptions.HTTPError处理请求失败的情况(如404) - 捕获
KeyError处理info字典中无'sector'字段的情况 - 主动检查info是否为空,抛出并捕获
ValueError,避免后续键访问报错 - 处理后
AXSM和AAPL正常输出'hi',FB触发异常处理并跳过,最终得到预期的两个'hi'输出
内容的提问来源于stack exchange,提问作者noviceprogramer
相关产品推荐
相关产品推荐

