网络爬虫:Selenium操作无URL/XPath变化的日期选择器如何定位元素
解决方法
问题原因
该站点的日期筛选下拉框属于动态渲染的悬浮层组件,展开后才会插入DOM结构,且不会修改原有触发按钮的路径,你之前使用绝对XPath定位的方式稳定性差,也无法匹配动态生成的下拉选项。
实现代码
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化驱动 driver = webdriver.Chrome(ChromeDriverManager().install()) driver.maximize_window() wait = WebDriverWait(driver, 10) # 最长等待10秒,可自行调整 # 打开目标页面 driver.get('https://niftygateway.com/sitewide-activity') # 等待日期选择按钮可点击后点击展开 date_trigger = wait.until(EC.element_to_be_clickable( (By.XPATH, '//button[.//span[text()="Right now"]]') )) date_trigger.click() # 等待Custom range选项加载后点击 custom_range_opt = wait.until(EC.element_to_be_clickable( (By.XPATH, '//span[text()="Custom range"]') )) custom_range_opt.click() # 选择自定义日期范围示例:11月1日到11月5日 # 先选开始日期11月1日,如果当前显示的不是目标月份,先点击切换月份按钮 # 切换到上一月份示例(需要的话取消注释,多次点击调整到目标月份): # prev_month_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(@aria-label,"Previous month")]'))) # prev_month_btn.click() start_date = wait.until(EC.element_to_be_clickable( (By.XPATH, '//div[contains(@class,"CalendarDay") and @aria-label="November 1, 2023"]') # 年份按需修改 )) start_date.click() # 再选结束日期11月5日 end_date = wait.until(EC.element_to_be_clickable( (By.XPATH, '//div[contains(@class,"CalendarDay") and @aria-label="November 5, 2023"]') # 年份按需修改 )) end_date.click() # 后续可添加确认操作、数据加载等待逻辑 # driver.quit() # 操作完成后关闭驱动
注意事项
- 代码中使用了显式等待替代
time.sleep(),避免网络波动导致元素未加载就触发操作的报错 - 日期定位依赖
aria-label属性,你可以按实际需要修改属性值中的月份、日期、年份即可 - 如果选择的日期范围跨月,先定位月份切换按钮切换到目标月份,再选择对应日期即可
内容的提问来源于stack exchange,提问作者Kristada673
相关产品推荐
相关产品推荐

