使用yahoo_fin调用Yahoo Finance外汇行情代码报错,求解决方案
解决yahoo_fin中get_live_price无法获取外汇实时价格的问题
问题原因分析
你遇到的问题核心在于:get_live_price函数底层依赖get_data来获取数据,但get_data是为股票类资产的页面结构设计的——它会在页面HTML中查找"HistoricalPriceStore"这个子串来提取历史数据,而Yahoo Finance的外汇(如EURUSD=X)页面完全没有这个结构,直接触发了ValueError。股票代码能正常运行,是因为它们的页面符合get_data的预期结构。
解决思路与实现方法
既然官方函数不支持外汇,我们可以自己实现一个针对外汇页面的实时价格获取函数,或者切换到兼容性更好的库:
方案1:自定义爬取函数(基于requests + BeautifulSoup)
直接针对Yahoo Finance外汇页面的结构,提取实时价格元素:
import requests from bs4 import BeautifulSoup def get_forex_live_price(ticker): # 构造外汇行情的Yahoo Finance页面URL url = f"https://finance.yahoo.com/quote/{ticker}" # 发送请求并确保请求成功 response = requests.get(url) response.raise_for_status() # 解析HTML页面 soup = BeautifulSoup(response.text, 'html.parser') # 定位实时价格的流元素(Yahoo Finance外汇页面的特征标识) price_streamer = soup.find('fin-streamer', {'data-test': 'qsp-price'}) if price_streamer: # 清洗价格文本并转为浮点数返回 return float(price_streamer.text.replace(',', '')) else: raise ValueError(f"Failed to fetch live price for {ticker} - page structure may have updated") # 测试调用 print(get_forex_live_price('EURUSD=X'))
方案2:切换到更适配的官方支持库(yfinance)
如果不想自己维护爬取逻辑,可以试试yfinance——这是Yahoo Finance官方认可的Python库,对股票、外汇等多种资产类型兼容性更好:
import yfinance as yf def get_universal_live_price(ticker): asset = yf.Ticker(ticker) # 获取当前市场实时价格 return asset.info['regularMarketPrice'] # 同时支持股票和外汇测试 print(get_universal_live_price('AAPL')) print(get_universal_live_price('EURUSD=X'))
注意事项
- Yahoo Finance的页面结构可能会随时更新,如果自定义爬取函数失效,需要检查页面元素的特征是否变化,调整
find方法的参数。 - 使用第三方库前记得先安装:
pip install requests beautifulsoup4 yfinance
内容的提问来源于stack exchange,提问作者PanyTiritas
相关产品推荐
相关产品推荐

