安装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数据开发的第三方库,维护更及时,兼容性更好。
- 安装或升级yfinance:
pip install yfinance --upgrade
- 替换原有代码:
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
相关产品推荐
相关产品推荐

