You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:54:09