网页爬取中用ChromeDriver操作下拉列表失败,求助解决方法
问题描述
我尝试用ChromeDriver访问网站 https://apps5.mineco.gob.pe/transparencia/mensual/,需要操作页面中的一个下拉列表,选择“Solo Proyectos”选项,但以下两段代码都无法生效:
第一段代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support.select import Select # Inicialización del driver driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) # Entrando al sitio indicado en la pregunta driver.get("https://apps5.mineco.gob.pe/transparencia/mensual/") time.sleep(5) # Filtro Lista=Select(driver.find_element("id","ctl00_CPH1_DrpActProy")) Lista.select_by_value("Proyecto")
第二段代码
# Inicialización del driver driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) # Entrando al sitio indicado en la pregunta driver.get("https://apps5.mineco.gob.pe/transparencia/mensual/") time.sleep(5) # Filtro Lista=driver.find_element(By.XPATH,'//*[@id="ctl00_CPH1_DrpActProy"]/option[3]') Lista.click()
问题分析与修正方案
原代码存在的问题
- 不可靠的等待方式:
time.sleep(5)是固定等待,若页面加载慢,元素可能还未渲染完成就执行操作,导致找不到元素 - 定位方式不规范:第一段代码中用字符串
"id"定位元素,不符合Selenium的标准用法,应使用By.ID常量 - 索引定位易失效:第二段代码通过option的索引
[3]定位,若页面结构变化,索引会失效 - 重复导入:第一段代码重复导入了
Select类,属于冗余代码
修正后的代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service as ChromeService # 初始化Chrome驱动 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://apps5.mineco.gob.pe/transparencia/mensual/") # 显式等待下拉框元素加载完成(最多等待10秒) wait = WebDriverWait(driver, 10) select_element = wait.until(EC.presence_of_element_located((By.ID, "ctl00_CPH1_DrpActProy"))) # 初始化Select对象并选择目标选项 select = Select(select_element) # 优先用可见文本选择,更稳定 select.select_by_visible_text("Solo Proyectos") # 若确认选项的value属性为"Proyecto",也可使用: # select.select_by_value("Proyecto")
关键修正点
- 用显式等待替代固定睡眠,确保元素完全加载后再操作,避免元素未找到的错误
- 使用
By.ID常量定位元素,符合Selenium规范 - 采用
select_by_visible_text选择选项,避免因页面结构变化导致的索引失效问题 - 清理了冗余的导入语句
内容的提问来源于stack exchange,提问作者Juan Jose Collantes Antezana
相关产品推荐
相关产品推荐

