使用PHP Simple HTML Dom提取div.page-content内首个标签至首个h4间的HTML
问题
我正在使用PHP Simple HTML Dom库从网页中获取HTML内容,需要提取div.page-content内部首个内容到第一个h4标签之间的HTML。示例结构如下:
<div class="page-content"> First text <p>Second text</p> <div>Third text</div> <p>More text</p> <h4>Subtitle 1</h4> <p>bla bla</p> <p>bla bla</p> <h4>Subtitle 2</h4> <p>bla bla</p> <p>bla bla</p> </div>
我尝试了以下代码,但无法获取任何内容:
$start = $html->find('div.page-content', 0); while ( $next = $start->next_sibling() ) { if ( $next->tag == 'h4') break; else{ echo $next->plaintext; echo '<br/>'; $start = $next; } }
我需要提取的目标内容是:
First text <p>Second text</p> <div>Third text</div> <p>More text</p>
解决方案
你之前的代码失效的核心原因:next_sibling()仅获取元素节点,且你初始的$start是整个div.page-content容器,它的next_sibling()指向容器外的元素,自然取不到目标内容;同时代码还忽略了容器内的首个文本节点("First text")。
要正确提取包含文本节点和元素节点的目标内容,需要遍历div.page-content的所有子节点,直到遇到第一个h4为止:
// 获取目标容器 $pageContent = $html->find('div.page-content', 0); $result = ''; // 遍历容器内的所有子节点(含文本、元素节点) foreach ($pageContent->nodes as $node) { // 遇到第一个h4标签时终止遍历 if ($node->tag === 'h4') { break; } // 拼接节点的原始HTML内容到结果 $result .= $node->outertext; } // 输出结果(可根据需求添加trim()去除首尾空白) echo $result;
关键说明
$pageContent->nodes会返回容器内的全部子节点,包括文本节点和元素节点,能覆盖你需要的"First text"这类纯文本内容。$node->outertext会保留节点的完整HTML结构(比如<p>Second text</p>的标签),而非仅提取纯文本。- 遍历到第一个
h4时立即停止,精准截取目标区间的内容。
内容的提问来源于stack exchange,提问作者ISFT
相关产品推荐
相关产品推荐

