因为股价由JavaScript动态渲染,lxml无法获取未加载的DOM内容;应优先调用公开API(如新浪、东财接口),无API时再用Selenium/Playwright配合显式等待和稳健XPath定位,并通过浮点容差判断数据更新。

为什么直接用 lxml + XPath 抓不到实时股价?
因为多数股票页面的股价是通过 JavaScript 动态渲染的,lxml 或 requests 获取的原始 HTML 里根本没有最新数字——你看到的只是占位符或初始值(比如 "--" 或 "0.00")。XPath 再精准也查不到没加载进 DOM 的内容。
该用什么替代方案?关键看数据来源是否开放
优先检查目标网站是否提供公开 API 或 JSON 接口(比如新浪财经、东方财富的行情接口),这类接口通常带 callback 参数或返回纯 JSON。若存在,直接 requests.get() 拿数据,再用 json.loads() 解析,比模拟浏览器快得多、稳得多。
- 常见路径如:
"https://hq.sinajs.cn/list=sz000001"(返回 JS 变量赋值文本) - 或:
"https://push2.eastmoney.com/api/qt/stock/get?secid=0.600519"(返回标准 JSON) - 若只有前端渲染且无公开接口,才考虑
selenium或playwright,但需指定等待条件,不能只靠固定time.sleep()
用 selenium 等工具时,XPath 怎么写才不翻车?
动态页面中,元素可能被包裹在多层 div 或 span 中,且 class 名含随机哈希(如 "price_abc123")。硬写 //div[@class="price"] 极易失效。
- 优先用属性定位:找带明确语义的
data-*属性,如//span[@data-field="currentPrice"] - 用文本特征兜底:如
//td[contains(text(), "最新价")]/following-sibling::td[1] - 务必加显式等待:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "..."))),否则容易拿到旧值或抛NoSuchElementException
提取后怎么判断数据是否真的更新了?
很多页面会缓存或伪刷新——DOM 更新了,但数值没变。别只比对字符串,要转成浮点后做微小差异判断。
立即学习“Python免费学习笔记(深入)”;
- 用
float()转换,捕获ValueError(防空值或“停牌”等非数字) - 对比时留
1e-5容差:abs(new_val - old_val) > 1e-5 - 记录时间戳字段(如有):
//span[@data-timestamp],比 DOM 更新时间更可靠
真正难的不是写 XPath,而是确认你抓的那个节点,背后有没有被定时轮询或 WebSocket 推送更新。没搞清这个,XPath 写得再准也没用。


















