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

Selenium如何获取WebElement中指定文本前后的所有img元素

问题说明

现有如下HTML结构,需要分别提取文本「Bobby gave:」和「and took」之间的所有img元素、以及「and took」之后的所有img元素。由于img数量动态可变,基于固定索引切片的Selenium代码无法适配通用场景:

<div>
  <img alt="Guest" >
  Bobby gave:   
  <img>
  <img>
  <img>
  <img>
   and took   
  <img>
  <img>
</div>

原有固定索引的问题代码如下:

message = driver.find_element(By.tag_name, 'div')
# 依赖固定位置,img数量变化时直接失效
imgs_1 = message.find_elements(By.tag_name, 'img')[1:4]
imgs_2 = message.find_elements(By.tag_name, 'img')[5:]
可行实现方案

直接以两个文本节点作为定位锚点,通过XPath的兄弟节点轴做位置判断,完全不依赖固定索引,不管中间img数量怎么变都能准确匹配:

from selenium.webdriver.common.by import By

# 先定位外层容器div
message = driver.find_element(By.TAG_NAME, 'div')

# 提取「Bobby gave:」和「and took」之间的所有img
imgs_1 = message.find_elements(
    By.XPATH,
    './img[preceding-sibling::text()[normalize-space()="Bobby gave:"] and following-sibling::text()[normalize-space()="and took"]]'
)

# 提取「and took」之后的所有img
imgs_2 = message.find_elements(
    By.XPATH,
    './img[preceding-sibling::text()[normalize-space()="and took"]]'
)

写法说明

  • normalize-space()会自动去除文本前后的空白、换行,兼容原HTML中文本带缩进、多余空格的情况,避免精确匹配失败
  • 第一组XPath的判断逻辑:当前img的前置同级节点中存在内容为「Bobby gave:」的文本,后置同级节点中存在内容为「and took」的文本,自动筛选出两个文本中间的所有img
  • 第二组XPath的判断逻辑:当前img的前置同级节点中存在内容为「and took」的文本,自动筛选出第二段文本之后的所有img
  • 开头的Guest头像img因为前置节点不存在「Bobby gave:」文本,会被自动排除,不需要手动做索引偏移
  • 如果遇到文本不是完全精确匹配的场景(比如存在前后缀文本),可以把判断条件里的normalize-space()="目标文本"替换为contains(normalize-space(), "目标文本"),适配更灵活的匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:27:17