0

我正在使用 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。

4

1 回答 1

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(*)]
于 2013-10-19T16:09:26.607 回答