如何使用Python在Selenium中遍历元素并实现预订逻辑?
Selenium元素遍历实现高尔夫时段预订逻辑
需求说明
- 用
for循环筛选所有早于特定时间的时段标题(panel titles) - 判断对应时段是否有4名高尔夫球手
- 满足条件时点击该时段的预订按钮
现有代码问题
你已经能选中目标日期,但遍历元素的XPath存在语法错误(@class='{'panel-heading'}'写法不符合规范),且未完成时间筛选、人数校验和预订点击的核心逻辑。
修正后完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from webdriver_manager.microsoft import EdgeChromiumDriverManager from selenium.webdriver.edge.service import EdgeService import time def pause(seconds): time.sleep(seconds) # 初始化Edge驱动 driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install())) driver.get('https://teewire.net/granada/') driver.maximize_window() pause(2) # 选择目标日期 target_date = "2022-10-30" driver.find_element(By.XPATH, f"//*[@id='gz-time-slot-calendar']//a[@data-moment='{target_date}']").click() pause(5) # 定义时间阈值(示例:筛选早于10:00的时段) target_time = "10:00" # 获取所有时段面板容器 time_slot_panels = driver.find_elements(By.XPATH, "//*[@id='time-slots-container-id']//div[contains(@class, 'panel')]") for panel in time_slot_panels: # 提取时段标题 panel_title = panel.find_element(By.XPATH, ".//a[@class='panel-heading']").text.strip() # 拆分出时间部分(假设标题格式为"HH:MM 附加内容") slot_time = panel_title.split()[0] # 判断时段是否早于目标时间 if slot_time < target_time: # 获取当前时段的球手人数(需根据实际HTML结构调整XPath) golfer_count = panel.find_element(By.XPATH, ".//span[contains(@class, 'gz-players-count')]").text.strip() # 校验人数是否为4 if golfer_count == "4": # 点击预订按钮(根据实际页面按钮文本/属性调整) book_button = panel.find_element(By.XPATH, ".//button[contains(text(), 'Book')]") book_button.click() print(f"已预订时段:{panel_title}") # 若只需预订第一个符合条件的时段,可添加break退出循环 # break driver.quit()
关键逻辑说明
- XPath修正:将错误的
@class='{'panel-heading'}'改为标准写法@class='panel-heading',同时通过遍历父面板容器,更方便关联时段的标题、人数和按钮。 - 时间筛选:拆分时段标题提取时间字符串,直接用字符串比较(需确保时间格式为
HH:MM,如09:30)。 - 人数校验:根据你提供的HTML截图结构,定位显示球手人数的元素,若页面结构有变化需对应调整XPath。
- 预订触发:在当前时段面板内定位预订按钮,确保点击的是对应时段的按钮。
优化建议
- 替换
pause()为显式等待,避免因页面加载慢导致元素定位失败:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 示例:等待时段容器加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "time-slots-container-id")) ) - 若页面元素的class或文本有变动,需同步调整对应的XPath定位规则。
内容的提问来源于stack exchange,提问作者sammytay10r
相关产品推荐
相关产品推荐

