Anbima网站爬虫遇TypeError:datetime.timedelta无len()方法,求解决
解决Anbima爬虫中日期输入的TypeError问题
错误原因分析
你碰到的TypeError: object of type 'datetime.timedelta' has no len(),本质是把timedelta对象直接传给了Selenium的send_keys方法。send_keys只接受字符串/数字这类可序列化的输入,而timedelta是时间间隔对象,Selenium内部处理时尝试获取它的长度,自然就报错了。问题出在你错误地将timedelta(days=1)赋值给了日期变量,而非先计算出圣保罗时区的前一天日期再转成字符串。
正确实现步骤(圣保罗时区)
下面是两种可靠的实现方式,核心是先拿到正确时区的当前日期,计算前一天,再格式化为输入框需要的字符串格式(比如DD/MM/YYYY,需根据Anbima网站的输入格式调整):
方式1:使用Python 3.9+内置的zoneinfo(推荐)
from datetime import datetime, timedelta from zoneinfo import ZoneInfo from selenium.webdriver.common.by import By from selenium import webdriver # 获取圣保罗时区的当前日期(仅取日期部分,排除时间) tz = ZoneInfo("America/Sao_Paulo") current_date = datetime.now(tz).date() # 计算前一天日期 previous_date = current_date - timedelta(days=1) # 格式化为网站要求的字符串,示例为DD/MM/YYYY,可根据实际调整 date_str = previous_date.strftime("%d/%m/%Y") # 定位输入框并输入日期 driver = webdriver.Chrome() # 替换为Anbima网站日期输入框的实际定位方式(ID/XPath/CSS选择器) date_input = driver.find_element(By.ID, "your-date-input-id") date_input.send_keys(date_str)
方式2:使用pytz(兼容Python旧版本)
如果你的Python版本低于3.9,用pytz处理时区:
from datetime import datetime, timedelta import pytz from selenium.webdriver.common.by import By from selenium import webdriver tz = pytz.timezone("America/Sao_Paulo") current_date = datetime.now(tz).date() previous_date = current_date - timedelta(days=1) date_str = previous_date.strftime("%d/%m/%Y") # 后续输入逻辑同方式1 driver = webdriver.Chrome() date_input = driver.find_element(By.ID, "your-date-input-id") date_input.send_keys(date_str)
其他日期减一天的实现方式
如果需要处理跨月、跨年这类复杂场景(比如1月1日减一天要得到去年12月31日),可以用dateutil的relativedelta:
from dateutil.relativedelta import relativedelta # 替换之前的timedelta写法即可 previous_date = current_date - relativedelta(days=1) date_str = previous_date.strftime("%d/%m/%Y")
注意事项
- 确认Anbima网站日期输入框的格式要求(比如是
YYYY-MM-DD还是DD/MM/YYYY),调整strftime的参数即可。 - 尽量只取
date()部分,避免时间(比如时分秒)干扰输入逻辑。
内容的提问来源于stack exchange,提问作者Joao victor
相关产品推荐
相关产品推荐

