Python/Selenium中XPath末尾如何使用通配符匹配指定格式片段?
Selenium定位嵌套路径不固定的read more按钮方案
你不需要纠结XPath后半段的路径差异,也不用写复杂的通配符匹配,用Selenium和XPath原生的节点查找逻辑就能稳定定位,以下是经过验证的可落地方案:
方案1:一次性获取所有目标按钮(实现最简单)
所有read more按钮的标签文本、href属性完全一致,直接用属性+文本匹配的XPath全局查找即可,完全不受中间嵌套层级影响:
from selenium.webdriver.common.by import By # 直接获取页面所有符合特征的read more按钮,无需关心父级路径 read_more_list = driver.find_elements( By.XPATH, '//a[@href="javascript:;" and text()="read more"]' )
拿到元素列表后直接遍历,逐个执行点击、抓内容、关弹窗的逻辑即可,不需要自己维护article序号。
方案2:按article序号逐个定位(适配你原有的循环逻辑)
如果你需要严格按照帖子排序逐个处理,只需要把XPath里article节点后的单斜杠改成双斜杠即可:双斜杠//在XPath里代表匹配当前节点下任意深度的后代节点,相当于自动通配所有中间的p、ul、li等嵌套层级,不需要你手动写全路径。
示例代码:
from selenium.webdriver.common.by import By # 先统计页面总共有多少个帖子article total_articles = len(driver.find_elements(By.XPATH, '//*[@id="page"]/div[2]/article')) for idx in range(1, total_articles + 1): # 定位对应序号的帖子,在帖子内部任意层级找read more按钮 read_more_btn = driver.find_element( By.XPATH, f'//*[@id="page"]/div[2]/article[{idx}]//a[text()="read more"]' ) # 先把按钮滚动到页面可视区域,避免遮挡导致点击失败 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", read_more_btn) read_more_btn.click() # 这里写你的显式等待、抓取弹窗内容、关闭弹窗逻辑
踩坑提示
- 不要用模糊的class、id属性定位,你给出的按钮本身的文本和href特征已经足够唯一,不会误抓其他元素。
- 点击按钮后记得加显式等待,等弹窗内容加载完成再抓取数据,避免拿到空内容。
- 关闭弹窗后建议加100-300ms的短等待,等弹窗遮罩完全消失再操作下一个按钮,避免出现元素不可点击的报错。
内容的提问来源于stack exchange,提问作者jagrakye
相关产品推荐
相关产品推荐

