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
相关产品推荐
相关产品推荐

