我有以下 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/