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

Python/Selenium提取日历预约信息遇阻:触发弹窗或获取属性

解决Selenium触发浮层与提取动态data属性的问题

一、修复点击触发浮层的问题

你当前代码里的appt.click只是引用了点击方法,并没有实际调用,这是第一个问题。先修正语法:

appt_path = '//table/tbody/tr/td/div/div[2]/div[1]/a'
appt = driver.find_element(By.XPATH, appt_path)
appt.click()  # 注意这里要加括号

如果修正后还是无法触发浮层,试试以下两种方案:

  • 等待元素可点击后再操作:网页元素可能还没完全加载完成,直接点击会失效,用显式等待确保元素处于可点击状态:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

appt_path = '//table/tbody/tr/td/div/div[2]/div[1]/a'
# 等待10秒,直到元素可点击
appt = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, appt_path))
)
appt.click()
  • 模拟真实鼠标点击:如果元素被遮挡或需要hover后才能点击,用ActionChains模拟完整的鼠标操作:
from selenium.webdriver.common.action_chains import ActionChains

appt_path = '//table/tbody/tr/td/div/div[2]/div[1]/a'
appt = driver.find_element(By.XPATH, appt_path)
# 移动到元素上再点击
ActionChains(driver).move_to_element(appt).click().perform()

二、提取动态的data-calendar-event-xxx属性中的预约ID

因为每个预约元素的属性名是动态生成的(前缀固定,后缀是唯一ID),不能直接用get_attribute指定固定名称,需要遍历元素的所有属性筛选目标:

方案1:通过get_property遍历属性

appt_path = '//table/tbody/tr/td/div/div[2]/div[1]/a'
appt = driver.find_element(By.XPATH, appt_path)

# 获取元素所有属性
attributes = appt.get_property('attributes')
for attr in attributes:
    # 筛选前缀为data-calendar-event-的属性
    if attr['name'].startswith('data-calendar-event-'):
        # 分割属性名提取ID
        appointment_id = attr['name'].split('-')[-1]
        print(f"预约ID:{appointment_id}")
        break

方案2:用JavaScript获取所有属性(更稳定)

如果get_property返回的属性不全,用JavaScript直接从DOM中提取所有属性:

appt_path = '//table/tbody/tr/td/div/div[2]/div[1]/a'
appt = driver.find_element(By.XPATH, appt_path)

# 执行JS脚本获取元素所有属性键值对
all_attrs = driver.execute_script("""
    var attrs = {};
    for (let i = 0; i < arguments[0].attributes.length; i++) {
        attrs[arguments[0].attributes[i].name] = arguments[0].attributes[i].value;
    }
    return attrs;
""", appt)

# 遍历筛选目标属性
for attr_name in all_attrs:
    if attr_name.startswith('data-calendar-event-'):
        appointment_id = attr_name.split('-')[-1]
        print(f"预约ID:{appointment_id}")
        break

如果需要遍历所有预约元素,把find_element改成find_elements,然后循环处理每个元素即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:10:20