Python读取CSV日期通过Selenium填充下拉日期框报错及优化咨询
问题1 报错原因
datetime.strptime的格式匹配规则是严格对应分隔符的,你CSV中读取的日期字符串是/作为分隔符(比如17/05/2021),但你写的格式串%d %m %Y用的是空格作为分隔符,二者不匹配所以抛出错误。
你只需要把格式串修改为'%d/%m/%Y'即可解决这个报错:
objd = datetime.strptime(d, '%d/%m/%Y')
问题2 现有实现的问题与优化方案
现有代码的错误
你的当前思路逻辑方向是可行的,但现有代码存在2个明显bug:
- 你调用
.click()方法后直接赋值给元素变量,click()没有返回值,会导致后续send_keys调用抛出NoneType相关报错,需要先定位元素再执行点击、输入操作 - 你前面解析得到的日期对象命名为
objd,后续调用却写的是objDate.day,变量名不匹配会报错
修正后的基础版本代码参考:
from datetime import datetime import csv from time import sleep from selenium.webdriver.common.keys import Keys with open('/Users/me/Downloads/dates_test.csv',newline='') as csvfile: readCSV = csv.reader(csvfile, delimiter=',') for row in readCSV: try: # 前面的driver初始化逻辑自行保留 d = row[1] objd = datetime.strptime(d, '%d/%m/%Y') # 先定位元素再操作 sign_up_date = driver.find_element_by_xpath("//*[@id='membership-signed-up-on']/a") sign_up_date.click() sleep(1) day1 = driver.find_element_by_xpath("//*[@id='membership_signed_up_on_3i']") day1.click() day1.send_keys(objd.day) day1.send_keys(Keys.RETURN) # 后续月、年的输入逻辑同理补充 except Exception as e: print(f"处理行{row}出错:{e}")
更优的处理方案
如果你的日期下拉框是标准的<select>标签,推荐直接使用Selenium内置的Select类操作,稳定性远高于手动输入回车:
from selenium.webdriver.support.ui import Select # 定位到日的select元素 day_select = Select(driver.find_element_by_id("membership_signed_up_on_3i")) # 按值选择对应日期 day_select.select_by_value(str(objd.day))
如果网站没有限制输入,还可以直接执行JS注入赋值,完全绕过前端交互限制,执行效率更高:
driver.execute_script("document.getElementById('membership_signed_up_on_3i').value = arguments[0]", str(objd.day))
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

