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

如何循环可用日期填充指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:46:21