动态预约时段表格抓取问题:Selenium无法定位已预订元素
解决Padelbox预订时段抓取的元素未找到问题
常见问题原因及修正方案
1. Cookie弹窗定位与等待逻辑错误
原代码直接使用find_element定位Cookie按钮,未等待元素加载完成,且XPATH中的class属性包含多余空格,易导致定位失败。建议改用显式等待+CSS选择器,稳定性更强。
2. 时段元素等待条件不合理
presence_of_element_located仅确保元素存在于DOM中,但可能尚未渲染可见,改用visibility_of_all_elements_located能保证元素已加载完成并可交互。
3. Selenium驱动初始化方式过时
旧版的webdriver.Chrome(path)已被弃用,使用Service类初始化驱动可避免版本兼容问题。
修改后的完整代码
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.webdriver.chrome.service import Service website = 'https://padelbox.de/koeln-weiden/padelplatz-buchen' path = '/Users/joeplamers/Downloads/chromedriver_mac_arm64/chromedriver' # 初始化驱动(新版兼容方式) service = Service(path) driver = webdriver.Chrome(service=service) driver.get(website) driver.maximize_window() wait = WebDriverWait(driver, 60) # 处理Cookie弹窗:等待按钮可点击后执行点击 try: cookie_accept_btn = wait.until(ec.element_to_be_clickable( (By.CSS_SELECTOR, 'a._brlbs-btn._brlbs-btn-accept-all._brlbs-cursor') )) cookie_accept_btn.click() except Exception as e: print("Cookie弹窗未出现或点击失败:", e) # 等待所有时段元素加载可见 wait.until(ec.visibility_of_all_elements_located( (By.CSS_SELECTOR, '[data-state="booked"], [data-state="available"]') )) # 抓取已预订和可用时段元素 booked_elements = driver.find_elements(By.CSS_SELECTOR, '[data-state="booked"]') available_elements = driver.find_elements(By.CSS_SELECTOR, '[data-state="available"]') # 输出结果示例 print(f"已预订时段数量: {len(booked_elements)}") for elem in booked_elements: print(f"已预订时段: {elem.text}") print(f"\n可用时段数量: {len(available_elements)}") for elem in available_elements: print(f"可用时段: {elem.text}") driver.quit()
额外排查点
- 若仍无法定位元素,检查页面是否存在iframe:打开浏览器开发者工具,查看时段元素是否嵌套在iframe中,若是需先切换iframe:
iframe = wait.until(ec.presence_of_element_located((By.TAG_NAME, 'iframe'))) driver.switch_to.frame(iframe) - 确认
data-state属性的实际取值,可通过浏览器开发者工具查看元素真实属性值。
内容的提问来源于stack exchange,提问作者jopie9810
相关产品推荐
相关产品推荐

