使用 XPath 获取节点的每个子节点的第一个子节点

use*_*666 2 html xpath

我正在尝试使用以下结构解析一些 HTML,如何使用 xpath提取<a>每个<li>元素的第一个元素?

<ul>
    <li>
        <a>
        <span>
        <a>
    </li>
    <li>
        <a>
        <span>
        <a>
    </li>
    ...
</ul>
Run Code Online (Sandbox Code Playgroud)

Mat*_*ler 6

@Mathias:你说得对,我道歉。//li/a[1] 不起作用,因为它不是直系子节点(中间有一个文章标签,为了简单起见,我省略了它)。

然后让我将此作为解决方案发布,并提供更多解释。

如果正如您所描述的那样,//li/a[1]在返回时没有返回任何内容(//li//a)[1],那么您显示的 HTML 示例并不代表您的实际文档。然后,a将是 的后代li,但不是它的直接子代。

在这种情况下,正确的 XPath 表达式是

//li//a[1]
Run Code Online (Sandbox Code Playgroud)

但仅当嵌套级别不同时才使用它,即如果li和之间可以嵌套其他元素a

<li>
  <article>
    <other>
      <a/>
Run Code Online (Sandbox Code Playgroud)

如果嵌套是一致的,但它并不总是在article这两者之间元素lia再利用

//li/*/a[1]
Run Code Online (Sandbox Code Playgroud)

这避免了在//计算上比 更昂贵的轴/

最后,如果您知道a您感兴趣的li元素始终是元素的孙子元素,并且始终是article它们之间的元素,请使用

//li/article/a[1]
Run Code Online (Sandbox Code Playgroud)

当我将表达式更正为 //li/article/a[1]' 时,我得到第一个 li 的第一个 a`。

//li/article/a[1]如果有多个a元素是 的子元素article和孙元素,则返回多个结果li。如果这仅返回一个结果

  • 您在只需要一个结果的上下文中调用此 XPath 表达式,例如,如果您在编程语言中使用 XPath 库或
  • 输入文档的结构更加复杂