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

