如何用Python+Selenium遍历下拉框选项并写入CSV?
问题描述
我有一段Python自动化代码,执行流程为:进入指定网站→登录账号→点击指定链接→选择日期→选择下拉框选项。现在需要实现依次选择下拉框的第1、2、3个选项,每次完成查询后将结果追加写入CSV文件,以下是我的现有代码,请问该如何实现?
from bs4 import BeautifulSoup from selenium.webdriver.common.by import By from selenium.webdriver.firefox import options from selenium.webdriver.firefox.options import Options from selenium.webdriver.support.ui import Select import pandas as pd import json from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from time import sleep options = Options() options.headless = False dia = '{:0>2}'.format(input("Qual o dia do agendamento ? = ")) navegador = webdriver.Firefox(options = options) wait = WebDriverWait(navegador, 30) link = 'https://extranet.ecopatio.com.br/' navegador.get(url = link) inicio_str_dia = "a[title='" final_str_dia = " de dezembro']" diadoagenda = (inicio_str_dia+dia+final_str_dia) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_txtLogin"))).send_keys('*********') wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_txtSenha"))).send_keys('*********') wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_btnEnviar"))).click() wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_TreeView2t8"))).click() wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, diadoagenda))).click() wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_ddlVagasTerminalEmpresa"))).click() wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_ddlVagasTerminalEmpresa"))).click() wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="ctl00_ctl00_Content_Content_ddlVagasTerminalEmpresa"]/option[3]'))).click() wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="divScroll"]'))) sleep(3) teste = navegador.find_element(By.XPATH, '//*[@id="divScroll"]').get_attribute('innerHTML') soup = BeautifulSoup(teste, "html.parser") Vagas = soup.find_all(title="Vaga disponível.") temp=[] for i in Vagas: on_click = i.get('onclick') temp.append(on_click) texto = str(temp) b = {'amp;': '', 'Cadastro': 'https://extranet.ecopatio.com.br/agendamento/Cadastro'} for x,y in b.items(): texto = texto.replace(x, y) achado2 = texto.split('\'')[1::6] df = pd.DataFrame(achado2) df.to_csv('testa.csv', mode='a', header=False, index=False)
解决方案
要实现循环选择下拉框前3个选项并分别保存结果,我们可以将数据抓取和写入逻辑封装到循环中,同时用Selenium的Select类简化下拉框操作。修改后的完整代码如下:
from bs4 import BeautifulSoup from selenium import webdriver # 补充缺失的导入 from selenium.webdriver.common.by import By from selenium.webdriver.firefox.options import Options from selenium.webdriver.support.ui import Select import pandas as pd from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep options = Options() options.headless = False dia = '{:0>2}'.format(input("Qual o dia do agendamento ? = ")) navegador = webdriver.Firefox(options=options) wait = WebDriverWait(navegador, 30) # 登录流程 link = 'https://extranet.ecopatio.com.br/' navegador.get(url=link) inicio_str_dia = "a[title='" final_str_dia = " de dezembro']" diadoagenda = inicio_str_dia + dia + final_str_dia wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_txtLogin"))).send_keys('*********') wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_txtSenha"))).send_keys('*********') wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_btnEnviar"))).click() wait.until(EC.element_to_be_clickable((By.ID, "ctl00_ctl00_Content_Content_TreeView2t8"))).click() wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, diadoagenda))).click() # 获取下拉框元素 dropdown = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_ctl00_Content_Content_ddlVagasTerminalEmpresa"))) select = Select(dropdown) # 循环处理前3个选项(索引0、1、2对应页面第1、2、3个选项) for index in range(3): # 选择对应索引的选项 select.select_by_index(index) # 等待结果区域加载完成 wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="divScroll"]'))) sleep(3) # 确保页面渲染完成 # 抓取并解析数据 teste = navegador.find_element(By.XPATH, '//*[@id="divScroll"]').get_attribute('innerHTML') soup = BeautifulSoup(teste, "html.parser") Vagas = soup.find_all(title="Vaga disponível.") temp = [] for i in Vagas: on_click = i.get('onclick') temp.append(on_click) texto = str(temp) b = {'amp;': '', 'Cadastro': 'https://extranet.ecopatio.com.br/agendamento/Cadastro'} for x, y in b.items(): texto = texto.replace(x, y) achado2 = texto.split('\'')[1::6] # 追加写入CSV df = pd.DataFrame(achado2) df.to_csv('testa.csv', mode='a', header=False, index=False) # 关闭浏览器 navegador.quit()
关键修改说明
- 补充依赖导入:添加
from selenium import webdriver,修复浏览器初始化报错问题 - 用Select操作下拉框:通过
Select类的select_by_index方法直接选择选项,替代原代码中重复点击和XPATH定位的冗余逻辑,提升稳定性 - 循环遍历选项:用
range(3)实现对前3个选项的循环处理,每个选项对应一次完整的查询和数据保存流程 - 优化等待逻辑:保留必要的
sleep确保页面渲染完成,结合WebDriverWait等待元素加载,平衡稳定性和效率 - 添加浏览器关闭:循环结束后调用
navegador.quit()释放资源
内容的提问来源于stack exchange,提问作者Alexandre Rodrigues
相关产品推荐
相关产品推荐

