You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:20:09