如何在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
相关产品推荐
相关产品推荐

