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

