找到 xpath 匹配的当前位置

finding the current position of xpath match

我正在尝试获取 xpath 匹配项的当前位置。这是一个真实世界的例子

在此页面上 http://newyork.backpage.com/homes-for-sale/

运行 下面的 xpath 匹配从顶部算起的第 8 个列表

//div[contains(@class, 'cat 93893742')]

我想以某种方式使用 xpath 获取广告位置,在发布此问题时它是“8”。我尝试使用 prececeding-sibling::div 但我得到了意想不到的结果。

想用 xpath 实现这个吗?

基于此和您的 previous question,也许以下 XPath 就是您要查找的内容:

count(
    //div[contains(@class, 'cat 93893742')]/preceding-sibling::div[contains(@class, 'cat ')]
)+1

在@har07 的回答中添加了一些描述

我想这就是你需要的

count(//div[contains(@class, 'cat 93893742')]/preceding-sibling::div[starts-with(@class,'cat')])+1

让我们分解一下整体

//div[contains(@class, 'cat 93893742')]

将匹配具有 classname = cat 93893742

的所需上下文节点
/preceding-sibling::div[starts-with(@class,'cat')]

将匹配上下文节点

之前以classname=cat开头的所有div元素

因此,如果我们将所有这些都保留在 count() 中,它将计算上下文节点之前的所有 div 标记 所以加 1 以包括上下文节点的计数

如果你想使用上面计算的索引指向那个元素,那么添加这个

//div[starts-with(@class,'cat')][count(//div[contains(@class, 'cat 93893742')]/preceding-sibling::div[starts-with(@class,'cat')])+1]

等于

//div[starts-with(@class,'cat')][10]   // 10 in index number

我不确定 htmlunit 的当前版本是否支持 XPath 2.0,但如果支持,您可以使用以下表达式:

index-of(//div[starts-with(@class, "cat")], //div[@class='cat 93893742'])

这将 return 10 - 在公共列表中的位置

如果您想获得特定日期 (Thu. May. 11) 在列表中的位置,您可以尝试:

index-of(//div[normalize-space()="Thu. May. 11"]/following::div[starts-with(@class, "cat")],//div[normalize-space()="Thu. May. 11"]/following::div[@class='cat 93893742'])

其中 returns 8