求助:如何用XPath提取指定字符串后的文本?附HTML及现有XPath
解决XPath提取特定前缀后文本的问题
这里有几个实用的XPath方案可以帮你提取“Cashback & codes promo”之后的文本,根据不同的XPath版本支持情况来选择:
方法1:使用substring-after()函数(最直接推荐)
如果你的XPath引擎支持XPath 1.0及以上(大部分工具、框架都支持),可以直接用字符串处理函数substring-after()来精准提取目标内容:
substring-after(/html/body/div[5]/div[5]/div[5]/div[2]/div[2]/div[1]/h1/text(), 'Cashback & codes promo ')
细节说明:
substring-after(原始字符串, 分隔前缀):这个函数会返回原始字符串中,第一个出现指定前缀之后的所有内容。- 注意前缀要和HTML里的实体对应——因为原HTML里写的是
&,所以XPath里要匹配Cashback & codes promo(末尾的空格也要保留,和原文本完全一致)。
方法2:适配实体转义的版本
有些场景下,XPath会自动把HTML实体转成实际字符(比如&变成&),这时候可以用实际的&来写前缀:
substring-after(/html/body/div[5]/div[5]/div[5]/div[2]/div[2]/div[1]/h1/text(), 'Cashback & codes promo ')
不确定实体是否被转义的话,两种写法都可以试试,看哪种能返回正确结果。
方法3:固定长度切片(备用方案)
如果你能确认前缀的字符长度是固定的,也可以用substring()函数从指定位置开始截取:
substring(/html/body/div[5]/div[5]/div[5]/div[2]/div[2]/div[1]/h1/text(), 26)
细节说明:
Cashback & codes promo(包含末尾空格)一共是25个字符,所以从第26位开始截取就能拿到后面的Direct Energie。不过这个方法不够灵活,一旦前缀内容有变化就会失效,所以优先推荐前两种方法。
另外,建议你优化一下XPath定位逻辑,用类名代替层级定位,这样页面结构调整时更稳定:
substring-after(//h1[@class='title title--sec color-black col-xs-12 merchant__title hide-tablet nopadding bold-text']/text(), 'Cashback & codes promo ')
内容的提问来源于stack exchange,提问作者Pierre-Clément Cazon
相关产品推荐
相关产品推荐

