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

Selenium查找无img标签元素时速度极慢问题求助

问题分析与解决方案

你的代码变慢的核心原因大概率是全局隐式等待的影响,或是低效的DOM查询逻辑,具体如下:

1. 隐式等待拖慢空元素查询

如果你的WebDriver设置了driver.implicitly_wait(n)(比如等待10秒),每次调用find_elements()时,Selenium会等待最多n秒确认元素是否出现后才返回结果。当p元素里没有img标签时,它会等够超时时间才返回空列表,多个空p累积下来就会导致程序极慢。

2. 冗余的DOM遍历逻辑

逐个遍历p元素再查找img,相当于对每个p都执行一次DOM查询,当大部分p不含img时,这些查询都是无效的,浪费了时间。


针对性优化方案

方案一:直接定位所有目标img(最推荐)

跳过遍历p元素的步骤,用XPATH直接定位容器内所有p标签下的img,一次查询拿到所有目标元素,彻底避免无效遍历:

images_container = driver_new.find_element(By.XPATH, '//*[@id="prod_add"]/div/div[1]/div[2]/div/div[1]/div/div/div[3]')
# 直接获取容器下所有p标签内的img
img_elements = images_container.find_elements(By.XPATH, './/p/img')

for img_index, img_element in enumerate(img_elements):
    try:
        image = img_element.get_attribute('src')
        image_extension = os.path.splitext(image)[1]
        # 如需保留p的索引,可从img的父节点p获取位置
        p_element = img_element.find_element(By.XPATH, './..')
        p_index = images.index(p_element)
        save_path = f"images/content_{p_index}_{img_index}{image_extension}"
        urllib.request.urlretrieve(image, save_path)
    except Exception as e:
        print(str(e))

方案二:临时关闭隐式等待(保留原遍历逻辑)

如果必须保留遍历p元素的逻辑,就在查询img时临时关闭隐式等待,查询完成后恢复,避免空元素等待:

images_container = driver_new.find_element(By.XPATH, '//*[@id="prod_add"]/div/div[1]/div[2]/div/div[1]/div/div/div[3]')
images = images_container.find_elements(By.TAG_NAME, 'p')

# 保存原隐式等待时间,临时设置为0
original_wait = driver_new.implicitly_wait(0)
try:
    for p_index, p_element in enumerate(images):
        img_elements = p_element.find_elements(By.TAG_NAME, 'img')
        for img_index, img_element in enumerate(img_elements):
            try:
                image = img_element.get_attribute('src')
                image_extension = os.path.splitext(image)[1]
                save_path = f"images/content_{p_index}_{img_index}{image_extension}"
                urllib.request.urlretrieve(image, save_path)
            except Exception as e:
                print(str(e))
finally:
    # 恢复原隐式等待时间
    driver_new.implicitly_wait(original_wait)

方案三:提前过滤含img的p元素

在遍历前先筛选出包含img的p元素,减少无效循环次数:

images_container = driver_new.find_element(By.XPATH, '//*[@id="prod_add"]/div/div[1]/div[2]/div/div[1]/div/div/div[3]')
# 直接获取所有包含img的p元素
images_with_img = images_container.find_elements(By.XPATH, './/p[img]')

for p_index, p_element in enumerate(images_with_img):
    img_elements = p_element.find_elements(By.TAG_NAME, 'img')
    for img_index, img_element in enumerate(img_elements):
        try:
            image = img_element.get_attribute('src')
            image_extension = os.path.splitext(image)[1]
            save_path = f"images/content_{p_index}_{img_index}{image_extension}"
            urllib.request.urlretrieve(image, save_path)
        except Exception as e:
            print(str(e))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:31:13