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

使用BeautifulSoup爬取雅虎财经黄金股价出现索引越界错误如何解决

报错原因
  • 索引取值逻辑错误:soup.findAll("div", class_='My(6px) Pos(r) smartphone_Mt(6px)')返回的列表长度不足3,列表索引从0开始计数,要取下标为2的元素需要列表至少有3个元素,否则就会触发索引越界错误,你提到的长度为4应该是统计对象错误,实际符合该类名的div数量不足3。
  • 反爬机制拦截:直接使用requests.get发起请求会被雅虎财经识别为爬虫,返回的页面不是完整的正常用户访问页面,缺失你要匹配的目标元素。
  • 元素匹配规则不稳定:你使用的类名是雅虎前端框架动态生成的样式类,会随平台更新定期变化,且find_all('p')返回的是列表,不能直接调用.text属性,本身也存在语法问题。
解决方法
  • 新增请求头模拟浏览器访问,绕过基础反爬拦截,确保返回完整页面结构。
  • 更换更稳定的元素匹配规则,使用页面中固定的业务属性定位价格元素,不要依赖容易变化的样式类和硬编码索引。
  • 增加非空判断,避免匹配不到元素时触发属性调用错误。

修正后的完整代码

from bs4 import BeautifulSoup
import requests, lxml

# 模拟浏览器的请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
response = requests.get('https://finance.yahoo.com/quote/GC=F?p=GC=F', headers=headers)
soup = BeautifulSoup(response.text, 'lxml')

# 用固定业务属性匹配黄金价格元素
price_ele = soup.find("fin-streamer", {"data-symbol": "GC=F", "data-field": "regularMarketPrice"})
if price_ele:
    gold_price = price_ele.get("value")
    print(f"GC=F当前价格:{gold_price}")
else:
    print("未获取到价格数据,请检查页面结构是否更新")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:06:02