如何让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
相关产品推荐
相关产品推荐

