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

