2009-08-10 40 views
1

今天我偶然发现了一个非常有趣的案例(至少对我而言)。我瞎搞与硒和XPath,并试图得到一些元素,但有一个奇怪的现象:xPath奇怪的行为 - 选择所有元素,即使[1]设置为

<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 

我得到的结果ALL,而不是只有第一个。但如果我查询:

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

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

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

最好的问候, bisko

回答

2

我想你想

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

此:

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

选择具有一个@class的所有(<a>元素是儿童)<div>元素'title',这是他们父母的第一个孩子(在这个领域T)。这意味着:它选择全部其中。

正在工作的XPath选择所有<div>元素的@class'title' - 以及那些需要第一个元素的元素。

谓词(在方括号[]表达式)施加到匹配前面的位置步骤中的各元件(即"//div"单独。要将谓词应用于过滤后的一组节点,您需要使用圆括号清除分组。

因此,该:

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

将选择所有<div>元素,取第一个,然后通过检查@class值过滤下来futher。也不是你想要的。 ;-)

+0

嗯,永远不会跨过我的脑海,谢谢! – bisko 2009-08-10 15:26:34