如何循环可用日期填充指定input?无可用日期时自动刷新页面
日期选择与自动刷新逻辑解决方案
应该使用哪种循环?
选择while True是最适合的方案,原因如下:
if语句只会检查一次,如果没有找到可用日期,无法重复执行页面刷新和提取操作。- 普通
while循环需要额外维护一个标记变量来跟踪是否找到日期,增加了不必要的复杂度。 while True会创建一个无限循环,只有当成功提取到可用日期时才跳出循环,完美匹配你"持续刷新直到找到可用日期"的需求。
修正后的实现代码
import re import time from selenium import webdriver from selenium.webdriver.common.by import By def extract_available_dates(html): # 优化正则表达式,捕获available_dates数组的完整内容 date_match = re.search(r'var\s*available_dates\s*=\s*(\[[^\]]+\])', html) if not date_match: return [] # 提取单个日期并去除引号 dates = re.findall(r'"([0-9\-]+)"', date_match.group(1)) # 将DD-MM-YYYY格式转换为输入框要求的YYYY-MM-DD格式 formatted_dates = [] for date in dates: day, month, year = date.split('-') formatted_dates.append(f"{year}-{month}-{day}") return formatted_dates # 初始化Selenium浏览器驱动(根据你的浏览器调整) driver = webdriver.Chrome() driver.get("你的目标页面URL") while True: # 获取当前页面的HTML源码 page_html = driver.page_source # 提取并格式化可用日期 available_dates = extract_available_dates(page_html) if available_dates: # 选择第一个可用日期(你可以根据需求调整选择逻辑) selected_date = available_dates[0] print(f"找到可用日期:{selected_date}") # 填充只读输入框(由于是readonly属性,需要通过JavaScript设置值) date_input = driver.find_element(By.ID, "app_date") driver.execute_script(f"arguments[0].value = '{selected_date}';", date_input) # 触发onchange事件提交表单 driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", date_input) # 在这里执行后续的Python脚本逻辑 # ... break # 找到日期后退出循环 else: print("未找到可用日期,正在刷新页面...") time.sleep(5) # 等待5秒后再刷新,避免频繁请求导致服务器限制 driver.refresh() # 关闭浏览器 driver.quit()
关键优化点:
- 正则表达式优化:更精准地捕获
available_dates数组的完整内容,避免遗漏日期。 - 日期格式转换:将提取到的
DD-MM-YYYY格式日期转换为输入框要求的YYYY-MM-DD格式。 - Selenium交互处理:针对只读输入框,使用JavaScript设置值并触发
onchange事件完成表单提交(标准send_keys()方法对只读字段无效)。 - 请求频率控制:添加
time.sleep()避免短时间内频繁刷新页面,防止被服务器限制访问。
原代码问题修正:
- 原正则表达式仅捕获
available_dates行的部分内容,优化后可捕获完整数组。 - 修复了原代码中的缩进错误。
- 补充了填充输入框、触发提交以及自动刷新的逻辑。
内容的提问来源于stack exchange,提问作者Elouali Issam
相关产品推荐
相关产品推荐

