使用BeautifulSoup4爬取雅虎财经股票价格返回[]的问题
问题排查与修复方案
我帮你梳理下代码里的几个关键问题,一步步解决:
1. 元素定位完全错误
你要找的目标span元素,class属性是Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib),而data-reactid是另一个独立属性,不是class。你写的soup.find_all("span", {"class": "data-reactid"})相当于在找class名为data-reactid的span,这显然不存在,所以返回空列表[]。
正确的定位方式应该是:
# 根据class定位(推荐,因为data-reactid可能动态变化) price_element = soup.find("span", class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)") # 或者如果想用data-reactid属性定位(不推荐,属性值可能随时变) # price_element = soup.find("span", attrs={"data-reactid": "35"})
2. 雅虎财经的反爬拦截
雅虎财经会检测请求的User-Agent,如果直接用requests.get(url)发送请求,没有模拟浏览器的请求头,返回的页面内容会和你在浏览器里看到的不一样——目标元素可能根本不存在,这也是你拿不到数据的重要原因。
你需要给请求添加headers,模拟浏览器访问:
def Calculation(): stock = Ticker_entry.get() url = make_url(stock) # 添加请求头,模拟Chrome浏览器 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers) soup = BeautifulSoup(page.content, "lxml") # 正确定位元素 price_element = soup.find("span", class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)") if price_element: stock_price = price_element.get_text(strip=True) print(stock_price) # 把结果填入输入框 Stock_price_output.delete(0, END) Stock_price_output.insert(0, stock_price) else: print("未找到股票价格元素")
3. 代码的其他小问题
- 导入模块时格式错误:
from tkinter import * from bs4 import BeautifulSoup应该拆分成两行,否则会报错:from tkinter import * from bs4 import BeautifulSoup import requests import lxml - 你当前的
Calculation函数只打印了结果,没有把数据填入对应的Stock_price_output输入框,上面的修复代码已经加上了这部分逻辑。
额外提醒
雅虎财经的页面结构可能随时更新,如果你之后又出现找不到元素的情况,记得重新检查浏览器里的元素结构,更新定位的选择器。
内容的提问来源于stack exchange,提问作者Leonardo Zapparoli
相关产品推荐
相关产品推荐

