今天我偶然发现了一个非常有趣的案例(至少对我而言)。我正在搞乱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
答案 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}}值进一步过滤它。也不是你想要的。 ; - )