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

Python Selenium中获取日历正确XPATH以定位指定日期的问题

解决Selenium定位日历指定日期的问题

问题根源

你之前的代码中,calendarMonth.find_element(By.XPATH, "//div[text()='{selectDay}']") 使用了//div,这是从整个文档根节点开始搜索匹配元素,所以会优先找到默认显示的8月日历中的日期,而非目标9月日历内的日期。

解决方案

方案1:修正相对路径定位

在子元素搜索时使用.//而非//,表示从当前元素(目标月份标题)的上下文范围内查找,而非整个文档:

import calendar
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By

dt_now = datetime.now()
selectMonth = 9  # 要定位的月份(9代表9月)
selectDay = "3"

test = f'{calendar.month_name[selectMonth]} {dt_now.year}'
# 定位目标月份的标题元素
calendarMonth = wb.find_element(By.XPATH, f"//b[text()='{test}']")
# 使用相对路径搜索当前月份容器下的日期div
calendarMonth.find_element(By.XPATH, f".//div[text()='{selectDay}']").click()

方案2:使用完整XPATH直接关联月份与日期

利用HTML结构中月份标题和日期同属一个tbody的特点,直接写一条XPATH一次性定位目标日期,无需分步查找:

import calendar
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By

dt_now = datetime.now()
selectMonth = 9
selectDay = "3"

test = f'{calendar.month_name[selectMonth]} {dt_now.year}'
# 直接定位到目标月份所在tbody下的指定日期
target_day = wb.find_element(By.XPATH, f"//b[text()='{test}']/ancestor::tbody//div[text()='{selectDay}']")
target_day.click()

如果需要更精准(避免页面其他无关div干扰),可以加上日期单元格的类名限制:

target_day = wb.find_element(By.XPATH, f"//b[text()='{test}']/ancestor::tbody//td[contains(@class, 'dayCell')]/div[text()='{selectDay}']")

为什么你之前的完整XPATH写法无效?

你尝试的//b[text()='{test}']//div[text()='{selectDay}'] 无法找到元素,是因为月份标题的<b>标签的后代节点中没有日期div——日期div在<b>所在行的下一行<tr>里,两者属于同一个<tbody>的兄弟节点,所以必须先定位到共同的父容器<tbody>,再在其中查找日期元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:34:58