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

如何正确实现web.DataReader?Yahoo数据源读取遇AttributeError

pandas_datareader调用Yahoo数据源报错的解决

问题描述

执行官方示例代码获取Yahoo金融数据时触发AttributeError: 'NoneType' object has no attribute 'group'错误,示例代码如下:

import pandas_datareader.data as web
import pandas as pd
import datetime as dt

df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2020-10-09')

完整错误栈:

AttributeError                            Traceback (most recent call last)
Cell In[4], line 1
----> 1 df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2020-10-09')

File ~\anaconda3\Lib\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 ~\anaconda3\Lib\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 ~\anaconda3\Lib\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 ~\anaconda3\Lib\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'

问题原因

Yahoo Finance的页面结构和数据返回格式已更新,pandas_datareader官方维护的Yahoo数据读取模块未跟进适配,导致正则表达式无法匹配到目标数据结构,返回None后调用group()方法触发错误。

解决方法

推荐方案:使用yfinance库替代

yfinance是专门用于获取Yahoo金融数据的第三方库,兼容原pandas_datareader的使用习惯,且持续维护适配Yahoo的更新:

  1. 安装依赖
pip install yfinance
  1. 替换后的代码示例
import yfinance as yf
import pandas as pd
import datetime as dt

start = dt.datetime(2019, 9, 10)
end = dt.datetime(2020, 10, 9)
# 下载数据,返回格式与原web.DataReader一致
df = yf.download('GE', start=start, end=end)

备选方案(不推荐):使用第三方修复版pandas_datareader

部分社区开发者对pandas_datareader的Yahoo模块进行了修复,可以安装分支版本,但由于官方已放弃维护Yahoo数据源,后续仍可能出现兼容问题:

pip install git+https://github.com/ranaroussi/fix-yahoo-finance.git

安装后可继续使用原web.DataReader代码,但稳定性无法保证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:14:50