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

如何让Selenium等待目标文本加载完成后抓取,避免返回空白结果

Selenium 动态文本元素抓取等待优化方案

问题背景

我使用Selenium从如下网站抓取数据:https://www.boerse-frankfurt.de/en/etf/ishares-core-s-p-500-ucits-etf-usd-acc

现有脚本可正常运行,但需要设置5秒固定等待时间确保数据加载完成,否则会随机出现空白返回结果,代码如下:

driver.get(url)
time.sleep(5)
bid = driver.find_element_by_xpath("/html/body/app-root/app-wrapper/div/div[2]/app-etp/div[2]/div[3]/div[2]/div/div[2]/app-widget-quote-box/div/div/table/tbody/tr[3]/td[1]").text
print(bid)

尝试使用Selenium自带的等待函数,但是脚本运行速度很快,仍然返回空白结果,代码如下:

driver.get(url)
try:
    bid = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH,"/html/body/app-root/app-wrapper/div/div[2]/app-etp/div[2]/div[3]/div[2]/div/div[2]/app-widget-quote-box/div/div/table/tbody/tr[3]/td[1]"))
    )
    bid = bid.text
    print(bid)
finally:
    pass

目前用简单的while循环判断可以实现需求,代码如下:

driver.get(url)
while driver.find_element_by_xpath(xpath).text == "":
   pass
driver.find_element_by_xpath(xpath).text

请问是否有更优的方案实现仅等待必要时长就完成数据抓取,不需要设置固定sleep时间?

原因分析

之前使用presence_of_element_located判断失效的核心原因是:这个条件仅校验元素是否存在于DOM树中,不校验元素是否可见、也不校验元素内容是否已经被渲染填充。目标网站的数据是异步加载的,元素会先出现在DOM里,后续才会把数值填充进去,所以会提前拿到空文本。

自行编写的while循环逻辑是对的,但空转的while循环会持续占用CPU资源,效率很低。

最优解决方案

直接使用Selenium显式等待的自定义条件,将「元素文本非空」作为等待触发条件,既不需要固定等待时长,也不会空转占用资源:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

target_xpath = "/html/body/app-root/app-wrapper/div/div[2]/app-etp/div[2]/div[3]/div[2]/div/div[2]/app-widget-quote-box/div/div/table/tbody/tr[3]/td[1]"
driver.get(url)

# 最多等待10秒,默认每500毫秒检查一次条件是否满足
bid_ele = WebDriverWait(driver, 10).until(
    lambda driver: driver.find_element(By.XPATH, target_xpath).text.strip() != ""
)
print(bid_ele.text)

可选优化点

  • 如果需要更快的响应,可以调整轮询间隔,比如每100毫秒检查一次:WebDriverWait(driver, 10, poll_frequency=0.1)
  • 可以增加元素可见性判断,双重校验避免异常:
from selenium.webdriver.support import expected_conditions as EC

bid_ele = WebDriverWait(driver, 10).until(
    lambda d: EC.visibility_of_element_located((By.XPATH, target_xpath))(d) 
    and d.find_element(By.XPATH, target_xpath).text.strip() != ""
)
  • 建议替换全路径XPATH为带特征的定位方式,比如根据元素的class、自定义属性定位,避免页面结构微调后定位失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:15:03