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

如何在PHP DOM中获取item-compromisso子节点的TIME_START等值

批量提取item-compromisso节点内的TIME_START、TIME_END和TITLE值

你可以在遍历每个item-compromisso节点时,以当前节点为上下文,使用相对XPath表达式批量提取子节点的值。核心是在调用DOMXPath::query()时传入第二个参数$element,限定查询范围为当前节点内部。

完整代码实现

$doc = new DOMDocument();
// 禁用错误输出避免HTML格式问题干扰
libxml_use_internal_errors(true);
$doc->loadHTML($url);
libxml_clear_errors();

$xPath = new DOMXPath($doc);
$domNodeList = $xPath->query('.//div[@class="item-compromisso"]');

$compromissos = [];
/** @var DOMElement $element */
foreach ($domNodeList as $element) {
    // 提取TIME_START
    $timeStartNode = $xPath->query('.//time[@class="compromisso-inicio"]', $element)->item(0);
    $timeStart = $timeStartNode ? trim($timeStartNode->textContent) : null;
    
    // 提取TIME_END
    $timeEndNode = $xPath->query('.//time[@class="compromisso-fim"]', $element)->item(0);
    $timeEnd = $timeEndNode ? trim($timeEndNode->textContent) : null;
    
    // 提取TITLE
    $titleNode = $xPath->query('.//h2[@class="compromisso-titulo toggle closed"]', $element)->item(0);
    // 若担心class顺序变化,可改用contains匹配核心类名:'.//h2[contains(@class,"compromisso-titulo")]'
    $title = $titleNode ? trim($titleNode->textContent) : null;
    
    // 存入数组统一管理
    $compromissos[] = [
        'TIME_START' => $timeStart,
        'TIME_END' => $timeEnd,
        'TITLE' => $title
    ];
}

// 输出结果查看
print_r($compromissos);

关键说明

  • 用trim()处理文本内容,去除多余空格、换行等无效字符
  • 每个查询后通过item(0)获取第一个匹配节点,并做存在性判断,避免节点不存在时引发错误
  • 相对XPath表达式开头的.表示从当前节点开始查询,而非整个文档

内容的提问来源于stack exchange,提问作者Walter Robynson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:38