【问题标题】:XPath Wildcards for HTMLHTML 的 XPath 通配符
【发布时间】:2013-10-20 00:09:26
【问题描述】:

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

【问题讨论】:

  • ID 是唯一的,所以使用//div[@id=...] 是合理的。如果没有任何示例输入,则无法对以下内容进行进一步评论。请至少发布整个 div,以及预期的输出。
  • 我在这里想要完成的是遍历某个定义为 XPath 字符串的 DOM 节点下的 DOM 节点。
  • 但是通过使用通配符。我可以使用其他环境或使用 CSS 选择器来完成此操作,但在 XPath 级别上执行此操作似乎要快得多,并且可以在运行时动态定义 if。
  • 如果您对这个单一用例有任何疑问,请发表意见,以便有人回答。事实上,它无法真正得到回答,我们所能做的就是猜测你想要做什么。
  • @JensErat 我已经编辑了这个问题。请看上方

标签: html dom xpath wildcard


【解决方案1】:

如果您不提供任何谓词,则不会应用额外的过滤器(除了元素名称,这里是 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(*)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2015-06-22
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多