xPath奇怪的行为 - 即使[1]设置,也选择所有元素

时间:2009-08-10 15:15:12

标签: xpath

今天我偶然发现了一个非常有趣的案例(至少对我而言)。我正在搞乱Selenium和xPath并尝试获取一些元素,但是有一个奇怪的行为:

<div class="resultcontainer">
   <div class="info">
     <div class="title">
        <a>
           some text
        </a>
     </div>
   </div>
</div>

<div class="resultcontainer">
   <div class="info">
     <div class="title">
        <a>
           some other text
        </a>
     </div>
   </div>
</div>

<div class="resultcontainer">
   <div class="info">
     <div class="title">
        <a>
           some even unrelated text
        </a>
     </div>
   </div>
</div>

这是我的数据。 当我运行以下xPath查询时:

//div[@class="title"][1]/a

我得到的结果是全部,而不仅仅是第一个。但如果我查询:

//div[@class="resultcontainer"][1]/div[@class="info"]/div[@class="title"]/a

我只得到第一个,而不是全部。

背后有一些神圣的理由吗?

祝你好运, bisko

1 个答案:

答案 0 :(得分:2)

我想你想要

(//div[@class="title"])[1]/a

此:

//div[@class="title"][1]/a

选择<a> <div> @class'title'元素的所有(<div>元素),这些元素是其父母的第一个孩子(在此上下文中) )。这意味着:它选择所有

工作XPath选择@class 'title' []的所有"//div"元素 - 以及第一个//div[1][@class="title"]/a 元素。

谓词(方括号<div>中的表达式)应用于与前一个位置步骤匹配的每个元素(即@class单独。要将谓词应用于已过滤的节点集,您需要使用括号清除分组。

因此,这个:

{{1}}

将选择所有{{1}}元素,取第一个元素,然后通过检查{{1}}值进一步过滤它。也不是你想要的。 ; - )