Selenium XPath如何合并span文本匹配包含指定子串的li元素
解决方案
XPath实现方式
你之前的写法失效是因为text()只会匹配li节点的直接文本子节点,不会自动合并后代span元素的文本内容。你可以使用string()和normalize-space()函数拼接节点所有后代文本后再匹配,写法如下:
//li[contains(normalize-space(string(.)), 'Addressing machine wholesaling')]
说明:
string(.)会将当前li节点的所有后代文本内容拼接为单个字符串normalize-space()会自动去除字符串首尾空白,同时将中间的换行、多空格等连续空白符替换为单个空格,避免元素排版产生的空白干扰匹配
如果需要更精准的定位,可加上父级ul的属性限制,避免匹配到其他列表的元素:
//ul[contains(@class, 'anzsicList')]/li[contains(normalize-space(string(.)), 'Addressing machine wholesaling')]
以上写法兼容XPath 1.0,所有Selenium支持的浏览器环境都可以直接使用。
非XPath替代方案
如果不想写复杂XPath,也可以用CSS选择器加遍历匹配的方式实现:
- 先用CSS选择器获取目标列表下的所有li元素
- 遍历每个li元素,调用Selenium元素的
text属性(该属性会自动合并所有后代文本并格式化空白),匹配到目标文本后停止遍历即可
Python示例代码:
from selenium.webdriver.common.by import By target = "Addressing machine wholesaling" li_list = driver.find_elements(By.CSS_SELECTOR, "ul.anzsicList.probable li") target_li = None for li in li_list: if target in li.text: target_li = li break # 后续直接操作target_li即可
该方案可读性更高,对于文本动态变化的场景适配性更好。
内容的提问来源于stack exchange,提问作者BANTYC
相关产品推荐
相关产品推荐

