【问题标题】:Xpath "preceding" check to find valueXpath“先前”检查以查找值
【发布时间】:2015-02-21 09:56:31
【问题描述】:

应用 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 来获得这个价格,而且还要确保我尽可能避免对各个节点相对于彼此的位置的假设,并尝试匹配 w​​rt 可见文本而不是像 div//span[1] 这样的 Html 节点定位. (这里的 Xpath 表示与第一个跨度匹配 - 如果可能,我会尽量避免)

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

如果出现在“FulFillment By Amazon”之前,则在“Buy New”之后查找价格

【问题讨论】:

    标签: c# xpath html-agility-pack


    【解决方案1】:

    这是一种可能的 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"> 元素只有如果商品是“亚马逊物流”:

    //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')]
    

    【讨论】:

      【解决方案2】:

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

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

      会显示

      99.99 美元

      【讨论】:

      • 感谢您的回复。我实际上是在尝试避免固定数量的此类硬编码 /../../../../ 。如果一个父母错过了任何其他类型的页面,这将不起作用。这就是为什么我检查preceding 而不是固定数量的/../。围绕这条线有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多