使用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
相关产品推荐
相关产品推荐

