我正在使用XPath来提取DOM元素值。 由于XPath不一致,我使用一些通配符魔法来选择同一级别的所有DOM元素。
HTML文档中的示例XPath:
//div[@id='floatswrap']/div/div[2]/div[1]
//div[@id='floatswrap']/div/div[2]/div[2]
//div[@id='floatswrap']/div/div[2]/div[3]
......
//div[@id='floatswrap']/div/div[2]/div[100]
我已经尝试了*/div[@id='floatswrap']/div/div[2]/div
通配符(注意开头的星号字符,末尾没有方括号),但它失败了。
所以我使用以下内容(上面的示例代码):
//div[@id='floatswrap']/div/div[2]/div[*]
(注意括号内的星号),现在就开始了。
由于我是XPath的新手,是否有更好,更一致的方法来使用通配符选择XPath节点?
修改 假设我有以下HTML:
<html>
<head>
</head>
<body>
<div id="floatswrap">
<div>
<div>First</div>
<div> <!-- SELECT ALL DIV NODES WRAPPED IN THIS DIV -->
Second
<div>One</div> <!-- SELECT THIS NODE -->
<div>Two</div> <!-- SELECT THIS NODE -->
<div>Three</div> <!-- SELECT THIS NODE -->
<!-- ........ --> <!-- SELECT ALL DIV NODES -->
<div>Hundred</div> <!-- SELECT THIS NODE -->
</div> <!-- ./Second DIV -->
</div>
<div> Some Text </div>
<div> Some Other Text </div>
</div> <!-- ./floatswrap -->
</body>
</html>
我正在尝试在第二个DIV中选择所有DIV。
答案 0 :(得分:0)
如果您不提供任何谓词,则不会应用额外的过滤器(但对于元素名称,此处为div)。 div[*]
实际上并非完全做你需要的事情;它只选择带有其他子节点的div。
这将选择您想要的所有div:
//div[@id='floatswrap']/div/div[2]/div
如果返回太多,您可能希望将位置谓词添加到第二个轴步骤:
//div[@id='floatswrap']/div[1]/div[2]/div
似乎不可能进一步简化;你可能只能选择不包含其他元素的div,但我不认为这在任何方面都更好:
//div[@id='floatswrap']//div[not(*)]