如何用Python Selenium循环选择年月下拉框并下载海关数据
批量下载多米尼加海关数据解决方案
问题背景
已实现单次从多米尼加海关网站选择年份、月份、数据类型后下载数据,但手动逐个选择年月效率极低,尝试循环批量处理时触发object of type 'WebElement' has no len()错误。
错误原因
尝试的循环代码中,使用driver.find_element(By.XPATH, '//*[@id="year"]/option[2]')仅获取了单个下拉选项元素,而非所有年份选项的集合,因此调用len()时触发类型错误;同时代码未覆盖完整的「选择参数-查询数据-触发下载」流程。
可行解决方案
使用Selenium的Select类简化下拉框操作,结合循环遍历目标年份与对应月份,完成批量下载:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import Select from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器(若chromedriver不在系统PATH,需传入路径参数) driver = webdriver.Chrome() driver.get("https://www.aduanas.gob.do/estadisticas/dinamicas/") driver.maximize_window() wait = WebDriverWait(driver, 15) # 定义要批量处理的年份与对应月份(可按需调整范围) target_year_months = { "2022": ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio"], "2023": ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"] } # 固定选择的数据类型(示例为第二个选项"Exportaciones") target_data_type = "Exportaciones" try: # 循环处理每个年份及对应月份 for year, months in target_year_months.items(): # 选择年份 year_select = Select(wait.until(EC.presence_of_element_located((By.ID, "year")))) year_select.select_by_visible_text(year) time.sleep(1) for month in months: # 选择月份 month_select = Select(wait.until(EC.presence_of_element_located((By.ID, "month")))) month_select.select_by_visible_text(month) time.sleep(1) # 选择数据类型 type_select = Select(wait.until(EC.presence_of_element_located((By.ID, "type")))) type_select.select_by_visible_text(target_data_type) time.sleep(1) # 点击查询按钮,等待数据加载 search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="App"]/div/div/div[1]/div/div[3]/div/div/form/div/div[4]/button/img'))) search_btn.click() time.sleep(5) # 点击下载按钮,触发文件下载 download_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="App"]/div/div/div[1]/div/div[3]/div/div/form/div/a'))) download_btn.click() time.sleep(3) finally: # 确保浏览器最终关闭 time.sleep(10) driver.quit()
代码说明
- 用
Select类直接通过可见文本选择下拉选项,比手动点击更稳定,避免元素定位错误 - 结合
WebDriverWait等待元素加载,替代部分固定time.sleep,提升代码健壮性 - 通过字典定义年份与月份的映射关系,可灵活调整需要批量下载的时间范围
- 加入
try-finally块,确保无论执行是否异常,浏览器都会正常关闭
内容的提问来源于stack exchange,提问作者user17743486
相关产品推荐
相关产品推荐

