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

