使用BeautifulSoup提取Yahoo Finance日期仅得时间及文本消失问题求助
解决Yahoo Finance日期提取不全及Soup文本消失问题
我帮你梳理下问题根源和解决方案:你现在遇到的两个问题,本质是Yahoo的反爬拦截和页面元素结构变更导致的,咱们一步步来解决:
问题原因拆解
- 反爬拦截:直接用
requests.get()不带请求头,很容易被Yahoo识别为机器人,返回的HTML内容会缺失关键数据,这就是你说的"soup生成后文本消失"的核心原因。 - 元素定位失效:Yahoo Finance的页面元素类名、ID经常会调整,你原来定位日期的
quote-market-notice元素,现在已经不再包含完整的日期时间信息了。
具体解决方案
1. 添加请求头模拟浏览器访问
给请求带上User-Agent,让服务器认为你是正常的浏览器用户,避免被拦截。
2. 重新定位日期时间元素
现在Yahoo的完整日期时间信息,藏在quote-market-notice下的子span标签里,需要调整选择器来精准定位。
修改后的完整代码
import requests from bs4 import BeautifulSoup technicals = {} ticker = "INFY.NS" try: url = f"https://finance.yahoo.com/quote/{ticker}/key-statistics?p={ticker}" # 添加请求头模拟浏览器,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } r = requests.get(url, headers=headers) # 先检查请求是否成功 if r.status_code != 200: print(f"请求失败,状态码:{r.status_code}") exit() soup = BeautifulSoup(r.text, 'lxml') # 提取当前价格(CMP) cmp_element = soup.find('span', class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)") if cmp_element: technicals["CMP"] = cmp_element.text.strip() print(f"当前价格:{technicals['CMP']}") else: print("未找到当前价格元素") # 提取完整的日期时间 market_notice = soup.find('div', id='quote-market-notice') if market_notice: # 定位包含完整日期时间的子span datetime_element = market_notice.find('span', class_="C($tertiaryColor) Fz(12px)") if datetime_element: full_datetime = datetime_element.text.strip() print(f"完整日期时间:{full_datetime}") else: print("未找到日期时间元素") else: print("未找到市场通知模块") except Exception as e: print(f"程序出错:{str(e)}")
额外提示
如果之后Yahoo又调整了页面结构,你可以用浏览器开发者工具(F12)重新定位元素:右键点击日期时间文本,选择"检查",查看最新的HTML标签和类名即可。
内容的提问来源于stack exchange,提问作者Tej
相关产品推荐
相关产品推荐

