Xpath "preceding" 检查以查找值

Xpath "preceding" check to find value

应用 Xpath 的 html 有点长,因此将 link 粘贴到需要触发 Xpath 的页面。

http://www.amazon.com/Greatest-Hits-More-Dr-Hook/dp/B003ANZBD0/ref=sr_1_1?ie=UTF8&qid=1424511706&sr=8-1&keywords=B003ANZBD0

我只想获取商品的 "Buy New" 价格,前提是该商品是 "Fulfilled By Amazon"。

我在 C# 上使用 Html Agility Pack。

这是我的尝试。我首先尝试查看该商品是否由亚马逊配送。 //div[@id='buyNewInner']//descendant::a[contains(@href,'isAmazonFulfilled=1')]

但我不知道如何从这里继续前往前面的节点并获取商品的价格,在本例中为 99.99 美元

目的不仅是用一个单一的 Xpath 来获得这个价格,而且还要确保我尽可能避免对各个节点相对于彼此的位置的假设,并尝试匹配 w.r.t 可见文本而不是 Html节点定位类似div//span[1]。 (这里的 Xpath 表示与第一个跨度匹配——如果可能的话我会尽量避免)

所以在这种情况下,我要实现的匹配逻辑是:

找到 "Buy New" 之后的价格,前提是它出现在 "FulFillment By Amazon"

之前

需要使用..返回到节点的父亲。使用您提供的示例页面,添加 ../../../../div[@id='buyNewSection'] 将您带到兄弟姐妹div 你需要的。 XPath:

//div[@id='buyNewInner']//descendant::a[contains(@href,'isAmazonFulfilled=1')]/../../../../div[@id='buyNewSection']//span[contains(@class,'offer-price')]

会显示

99.99 美元

这是一种可能的 XPath(为了便于阅读而格式化),它是根据您检查该商品是否由 Amazon 配送的尝试构建的。

//div[
        @id='buyNewInner' 
            and 
        .//descendant::a[contains(@href,'isAmazonFulfilled=1')]
     ]
/preceding-sibling::div[@id='buyNewSection']
//span[contains(@class,'offer-price')]

XPath 的第一部分 returns <div id="buyNewInner"> 元素 如果项目是 "Fulfilled By Amazon" :

//div[
        @id='buyNewInner' 
            and 
        .//descendant::a[contains(@href,'isAmazonFulfilled=1')]
     ]

下一位returns <div id="buyNewSection"> 假定位于buyNewInner div 之前的同一级别,因此我们使用preceding-sibling :

/preceding-sibling::div[@id='buyNewSection']

然后最后一部分直接进入包含商品价格的 <span> :

//span[contains(@class,'offer-price')]