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

Selenium日历数据提取:如何获取指定截止日期前全部可选日期

问题根因

你访问的预订网站日历采用懒加载机制,默认仅渲染当前可视区域内的日期DOM节点,未翻页展示的月份日期不会被加载到页面中,因此直接查询//div[contains(@class,'dw-cal-day')]只能获取到初始加载的12月11日之前的日期。

修复后代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

PATH = "/Users/king/Desktop/Python/chromedriver.exe"
driver = webdriver.Chrome(PATH)
# 最长等待时间,可根据网络情况调整
wait = WebDriverWait(driver, 10)

driver.get("https://www.tablecheck.com/shops/peterluger/reserve")

# 点击打开日历
wait.until(EC.element_to_be_clickable((By.ID, "reservation_start_date"))).click()

list_entry = []
# 这里和你原来的筛选条件保持一致
target_condition = ['December']

while True:
    # 等待当前页日期加载完成
    wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class,'dw-cal-day')]")))
    # 获取当前页所有日期节点
    allentry = driver.find_elements(By.XPATH, "//div[contains(@class,'dw-cal-day')]")
    
    for date in allentry:
        date_id = date.get_attribute('aria-label')
        # 过滤不可选、空、已存入的日期
        if date.get_attribute('aria-disabled') == 'true' or date_id is None or date_id in list_entry:
            continue
        list_entry.append(date_id)
    
    # 判断是否已经到达需要停止的月份,可根据你的需求调整终止条件,示例到12月之后就停止
    current_month = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class,'dw-cal-month')]"))).text
    if "January" in current_month: 
        break
    
    # 点击下一页按钮
    try:
        next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@class,'dw-cal-btn-next')]")))
        next_btn.click()
    except TimeoutException:
        # 没有下一页按钮就终止循环
        break

# 按你原来的逻辑筛选符合条件的日期
new_list = [date for date in list_entry if any(cond in date for cond in target_condition)]
print(new_list)

driver.quit()

注意事项

  • 终止翻页的判断条件可以根据你实际要爬取的截止时间调整,如果要爬多个月的话修改判断逻辑即可
  • 原代码里的driver.refresh()是多余操作,会重置页面状态,修复后的代码已经移除
  • 如果你使用的是Selenium 4.6+版本,不需要手动指定chromedriver路径,Selenium会自动匹配对应版本的驱动

内容的提问来源于stack exchange,提问作者user17118039

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:01