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

如何在Selenium Python的XPath选择器中正确使用fn:tokenize

问题分析与解决方案

为什么你的XPath表达式报错?

大部分现代浏览器的内置XPath引擎仅支持XPath 1.0,而tokenize()是XPath 2.0及以上版本才提供的字符串分割函数,直接使用会被判定为无效表达式。

方案1:结合Selenium代码处理(更简单可靠)

既然XPath 1.0不支持原生分割,我们可以先定位到目标元素,再在Python代码里对文本做分割处理:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

with webdriver.Edge() as driver:
    try:     
        driver.get("http://acme.com")
        # 先定位到目标font元素
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//font[@face='sans-serif' and @size='4']"))
        )
        # 分割文本并取第3个token(索引从0开始,[2]对应Networks)
        text_tokens = element.text.split(" * ")
        if len(text_tokens) >=3:
            print(text_tokens[2])
        else:
            print("分割后不足3个token")
    except Exception as e:
        print(f"失败原因: {e}") 
    finally:
        driver.quit()

方案2:纯XPath 1.0实现字符串分割并选第n项

如果必须只用XPath完成,需要通过XPath 1.0的字符串函数组合实现,核心是通过截取分隔符前后的文本:

取第3个token(Networks)的XPath表达式:

substring-before(
  substring-after(
    substring-after(//font[@face='sans-serif' and @size='4'], " * "), 
    " * "
  ), 
  " * "
)

原理说明:

  • substring-after(文本, 分隔符):截取分隔符第一次出现后的文本
  • 嵌套两次substring-after后,得到第二个分隔符之后的内容:Networks * Fun
  • 再用substring-before截取到下一个分隔符之前的内容,就是目标token

通用规则:

取第n个token时,嵌套n-1次substring-after;如果目标不是最后一个token,再用1次substring-before截取到下一个分隔符前;如果是最后一个token,去掉外层的substring-before即可。

Selenium是否有特定语法?

没有。Selenium的By.XPATH完全依赖当前浏览器的XPath解析引擎,没有额外专属语法。所有XPath表达式的有效性,取决于浏览器支持的XPath版本(目前主流浏览器均支持XPath 1.0)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:14