You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安装pandas DataReader后调用Yahoo接口获取股票数据报AttributeError

解决pandas_datareader读取Yahoo数据时的AttributeError问题

问题场景

在Jupyter Lab中运行以下代码:

aapl = data.DataReader('AAPL', 'yahoo', start_date, end_date)
aapl

执行后触发AttributeError: 'NoneType' object has no attribute 'group',完整错误栈如下:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[27], line 1
----> 1 aapl = data.DataReader('AAPL', 'yahoo', start_date, end_date)
      2 aapl

File /opt/miniconda3/lib/python3.12/site-packages/pandas/util/_decorators.py:213, in deprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper(*args, **kwargs)
    211         raise TypeError(msg)
    212     kwargs[new_arg_name] = new_arg_value
--> 213 return func(*args, **kwargs)

File /opt/miniconda3/lib/python3.12/site-packages/pandas_datareader/data.py:379, in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
    367     raise NotImplementedError(msg)
    369 if data_source == "yahoo":
    370     return YahooDailyReader(
    371         symbols=name,
    372         start=start,
    373         end=end,
    374         adjust_price=False,
    375         chunksize=25,
    376         retry_count=retry_count,
    377         pause=pause,
    378         session=session,
--> 379     ).read()
    381 elif data_source == "iex":
    382     return IEXDailyReader(
    383         symbols=name,
    384         start=start,
   (...)
    390         session=session,
    391     ).read()

File /opt/miniconda3/lib/python3.12/site-packages/pandas_datareader/base.py:253, in _DailyBaseReader.read(self)
    251 # If a single symbol, (e.g., 'GOOG')
    252 if isinstance(self.symbols, (string_types, int)):
--> 253     df = self._read_one_data(self.url, params=self._get_params(self.symbols))
    254 # Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT'])
    255 elif isinstance(self.symbols, DataFrame):

File /opt/miniconda3/lib/python3.12/site-packages/pandas_datareader/yahoo/daily.py:152, in YahooDailyReader._read_one_data(self, url, params)
    150 ptrn = r"root\.App\.main = (.*?);\n}\(this\)\);"
    151 try:
--> 152     j = json.loads(re.search(ptrn, resp.text, re.DOTALL).group(1))
    153     data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"]
    154 except KeyError:

AttributeError: 'NoneType' object has no attribute 'group'

已将pandas_datareader更新至最新版本,问题仍未解决。

解决方法

这个错误的核心原因是Yahoo Finance的页面结构发生了变更,pandas_datareader内置的Yahoo读取器无法适配新结构。以下是几种可行的解决方式:

方案1:使用yfinance库(推荐)

yfinance是专门针对Yahoo Finance数据开发的第三方库,维护更及时,兼容性更好。

  1. 安装或升级yfinance:
pip install yfinance --upgrade
  1. 替换原有代码:
import yfinance as yf
aapl = yf.download('AAPL', start=start_date, end=end_date)
aapl

方案2:临时修改pandas_datareader源码(不推荐)

如果必须使用pandas_datareader,可以修改其Yahoo读取器的正则表达式来适配新页面结构:

  • 找到pandas_datareader安装目录下的yahoo/daily.py文件(示例路径:/opt/miniconda3/lib/python3.12/site-packages/pandas_datareader/yahoo/daily.py)
  • 将第150行的正则表达式:
    ptrn = r"root\.App\.main = (.*?);\n}\(this\)\);"
    
    替换为:
    ptrn = r"root\.App\.main = (.*?);\n}\);"
    

注意:这种方法是临时方案,Yahoo再次更新页面结构后会失效,且修改库文件不利于后续版本升级。

方案3:切换至其他数据源

如果对数据源没有硬性要求,可以改用pandas_datareader支持的其他数据源,比如Alpha Vantage(需要提前申请API密钥):

from pandas_datareader import data
aapl = data.DataReader('AAPL', 'av-daily', start=start_date, end=end_date, api_key='你的Alpha Vantage API密钥')

内容的提问来源于stack exchange,提问作者jkhan678

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:00:06