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

