我有以下HTML代码段:
<div id="result-1">
<div class="page">
<div class="collapsingblock">
<h4>Click Me</h4>
</div>
<div class="collapsingblock collapsed">
<h4>No, Click Me</h4>
</div>
</div>
</div>
我正在尝试做的是找到第二个collapsingblock
并且它是h4
我有以下内容:
(//div[@id="result-1"]/div[@class="page"]/div[@class="collapsingblock"])[2]/h4
我的xPath不返回该元素。如果我用[1]
替换它,它会找到collapsingblock
的第一个实例
有什么想法吗?
由于
更新:
我刚才注意到,HTML正在使用JavaScript向第二个collapsingblock
添加/删除其他类,collapsed
答案 0 :(得分:1)
问题是第二个内部class
元素的div
属性的值不等于&#34; collapsingblock&#34;,因为你可以见:
<div class="collapsingblock collapsed">
<h4>No, Click Me</h4>
</div>
即使class
在HTML中具有非常明确的语义,但它并不意味着XPath有任何特殊之处,它与其他任何属性一样。
使用contains()
来避免此问题:
(//div[@id="result-1"]/div[@class="page"]/div[contains(@class,"collapsingblock")])[2]/h4
然后,上面表达式的唯一结果是
<h4>No, Click Me</h4>
顺便说一下,在这种情况下,表达式左手部分的括号是不:
//div[@id="result-1"]/div[@class="page"]/div[contains(@class,"collapsingblock")][2]/h4
在给定此特定输入文档的情况下,将完全相同。
答案 1 :(得分:0)
由于优先权,括号是必要的:
(//div[@id="result-1"]/div[@class="page"]/div[@class="collapsingblock"])[2]/h4