Xpath“前置”检查以查找值

时间:2015-02-21 09:56:32

标签: c# xpath html-agility-pack

正在应用Xpath的html有点长,因此粘贴到需要触发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

我希望得到"购买新的"物品的价格,仅当物品是"由亚马逊实现"。

我在C#上使用Html Agility Pack。

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

但我不知道如何从这里继续前往前面的节点并获得该物品的价格,在这种情况下为99.99美元

意图不仅有一个Xpath来获得这个价格,而且还确保我尽可能避免各个节点相对于彼此的位置,并尝试匹配wrt可见文本而不是像{{1一样的Html节点定位}}。 (这里Xpath表示与第一个跨度匹配 - 如果可能的话,我试图避免)

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

在"购买新"后面找到价格。如果这发生在" FulFillment By Amazon"

之前

2 个答案:

答案 0 :(得分:2)

这是一个可能的XPath(格式化为可读性),基于您尝试检查该项是否由亚马逊履行而构建。

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

XPath的第一部分返回<div id="buyNewInner">元素如果该项目是&#34;由亚马逊实现&#34; :

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

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

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

然后最后一部分直接转到包含商品价格的<span>

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

答案 1 :(得分:0)

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

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

将显示

$ 99.99