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

如何用XPath提取商品当前零售价:优先选择Sale Price

解决商品价格提取的XPath方案

嘿,作为XPath新手遇到这种条件提取的问题很正常,我来给你一步步讲清楚怎么搞定!

首先明确你的核心需求:从给定HTML里提取每个商品的当前零售价,规则是:有「Sale Price」就优先取它,没有的话就用「Regular Price」。

你的原始HTML结构

<li class="ProductPrice"> 
  <span class="Regular Price">80.00</span> 
  <span class="Sale Price">50.00</span> 
</li> 
<li class="ProductPrice"> 
  <span class="Regular Price">100.00</span> 
</li>

核心XPath方案

我分两种场景给你写表达式,适配不同的XPath版本:

场景1:支持XPath 2.0+(比如新版Selenium、XQuery工具)

这个写法更直观,用if-else逻辑直接对应你的规则:

//li[@class='ProductPrice']/normalize-space(
  if(span[@class='Sale Price']) 
  then span[@class='Sale Price']/text() 
  else span[@class='Regular Price']/text()
)

关键解释:

  • //li[@class='ProductPrice']:选中所有商品价格的容器节点
  • if(span[@class='Sale Price']):检查当前容器内是否存在Sale Price标签
  • 存在则取Sale Price的文本,不存在则取Regular Price的文本
  • normalize-space():自动去掉文本前后的换行、空格,保证提取的价格格式干净

场景2:仅支持XPath 1.0(比如旧版爬虫工具、部分测试框架)

XPath 1.0没有if-else语法,我们用管道符|结合条件判断实现需求:

//li[@class='ProductPrice']/normalize-space(
  span[@class='Sale Price']/text() 
  | 
  span[@class='Regular Price']/text()[not(../span[@class='Sale Price'])]
)

关键解释:

  • 第一部分span[@class='Sale Price']/text():先提取所有存在的Sale Price文本
  • 第二部分span[@class='Regular Price']/text()[not(../span[@class='Sale Price'])]:仅提取所在容器无Sale Price的Regular Price文本
  • 管道符|会合并两部分结果,刚好每个商品只会返回符合规则的一个价格

验证结果

用上述表达式提取你提供的HTML,会得到:

  • 第一个商品:50.00(优先取Sale Price)
  • 第二个商品:100.00(无Sale Price,取Regular Price)

新手实用小提示

  • 如果标签的class可能包含额外类名(比如class="Sale Price Limited"),可以把@class='Sale Price'改成contains(@class, 'Sale Price'),适配更灵活的class写法
  • 测试XPath可以用浏览器开发者工具:按F12打开控制台,输入$x("你的XPath表达式")就能实时看到结果,非常方便!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:20:20