用于HTML的XPath通配符

时间:2013-10-18 19:57:03

标签: html dom xpath wildcard

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

1 个答案:

答案 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(*)]