php - 遍历 xpath 中的子 li 节点

标签 php dom xpath

我有以下 HTML:

$page = '<html>
<head>
<title>Page</title>
</head>

<body>

<div>
    <div>
        <div>
        </div>
        <div class="this one">
            <h2>Ignore</h2>
            <p>Text</p>

            <h2>Header 1</h2>
            <ul><li>List Value 1</li></ul>

            <h2>Header 2</h2>
            <ul><li>List Value 2</li></ul>

            <h2>Ignore</h2>
            <ul><li>List Value 3</li></ul>

            <h2>Header 3</h2>
            <ul>
                <li>List Value A</li>
                <li>List Value B</li>
                <li>List Value C</li>
            </ul>

            <h2>Ignore</h2>
            <p>Text</p>
        </div>
    </div>
</div>

</body>
</html>';

我正在尝试获取 li Header 3 的列表只有,下面的代码不起作用;
$doc->loadHTML($page);   
$xpath = new DomXPath($doc);

$nodes = $xpath->query("//div[@class='this one']/h2[.='Header 3']/ul/li");
foreach($nodes as $node) { 
    echo $node->nodeValue . "<br />";
}

我期待输出:
List Value A<br />
List Value B<br />
List Value C<br />

最佳答案

这是您想要的表达式:

//div[@class = 'this one']/h2[text() = 'Header 3']/following-sibling::ul[1]/li

稍微分解一下:
  • //div[@class = 'this one'] - 匹配所有 <div> s 在文档中指定 class属性值
  • …/h2[text() = 'Header 3'] - 匹配所有 <h2>是那些 <div> 的 child 的 s具有指定文本内容的s
  • …/following-sibling::ul - 使用 following-sibling轴匹配<ul>出现在 <h2> 之后的 s小号
  • …[1] - 仅匹配第一个 <ul>是匹配的 <h2> 的兄弟(……记住索引在 XPath 表达式中是从 1 开始的)
  • …/li - 并匹配所有 <li> s 是那个 <ul> 的 child
  • 关于php - 遍历 xpath 中的子 li 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51884659/

    相关文章:

    xpath - xpath查询是否具有像mysql这样的Limit选项

    php - FFMPEG 在打开输出流#0 :0 - maybe incorrect parameters such as bit_rate, 速率、宽度或高度的编码器时无法转码 mp4 错误

    javascript - 如何在 "circle"中循环颜色?

    javascript - 获得原始目标的最佳方式

    html - XPath 和 XQuery 可以处理 HTML 文档吗?

    xpath - 从后代的文本中获取元素

    php - 如何让 Slim Framework 工作而不必在 URL 中放入/index.php?

    php - 使用 Gsuite 邮件时电子邮件在 laravel 上不起作用

    javascript - 返回 false 不会停止表单提交

    jquery - 包装从类 ="foo"到类 ="bar"的所有元素