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

使用pandas_datareader调用Yahoo Finance数据时出现TypeError错误的原因

问题:pandas_datareader调用Yahoo Finance时出现TypeError错误

我正在学习Udemy平台的Python与金融课程,使用pandas_datareader调用Yahoo Finance的股票数据时遇到了问题。

执行的代码:

import numpy as np
import pandas as pd

from pandas_datareader import data as wb
PG = wb.DataReader('PG', data_source='yahoo', start='1995-1-1')

返回的错误信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_16532\693660725.py in <module>
----> 1 PG = wb.DataReader('PG', data_source='yahoo', start='1995-1-1')

~\anaconda3\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

~\anaconda3\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
    368 
    369     if data_source == "yahoo":
--> 370         return YahooDailyReader(
    371             symbols=name,
    372             start=start,

~\anaconda3\lib\site-packages\pandas_datareader\base.py in 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):

~\anaconda3\lib\site-packages\pandas_datareader\yahoo\daily.py in _read_one_data(self, url, params)
    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:
    155             msg = "No data fetched for symbol {} using {}"

TypeError: string indices must be integers

错误原因分析:

这个TypeError的核心原因是Yahoo Finance的页面结构已更新,而你当前使用的pandas_datareader版本仍依赖旧的页面解析逻辑:

  • pandas_datareader的YahooDailyReader模块会通过正则表达式从Yahoo Finance的页面源码中提取一段内容,试图将其转为JSON字典(j = json.loads(...))。
  • 但现在Yahoo Finance返回的页面结构发生了变化,正则匹配到的内容不再是有效的JSON字符串,而是普通文本,导致j变成了字符串类型。
  • 当代码尝试用字典索引方式(j["context"]...)访问字符串时,就会触发"string indices must be integers"的错误——因为字符串只能用整数下标访问字符,不能用字符串键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:20:26