PHP中使用XPath将HTML无序列表转换为多维数组的实现方法
PHP DOMXPath 提取物流结构化数据实现方案
以下是可直接运行的调整后代码,可自动拆分status/data/hora等字段生成目标多维数组:
<?php // 此处替换为你的实际HTML内容 $sourceHtml = '你的HTML代码片段'; // 初始化DOM解析器,屏蔽非标准HTML的警告提示 $dom = new DOMDocument(); libxml_use_internal_errors(true); // 解决中文乱码问题 $dom->loadHTML('<?xml encoding="UTF-8">' . $sourceHtml); libxml_clear_errors(); $xpath = new DOMXPath($dom); $logisticsData = []; // 第一步:查询所有class包含linha_status的ul节点 $eventUlList = $xpath->query('//ul[contains(@class, "linha_status")]'); foreach ($eventUlList as $ulNode) { $eventItem = []; // 第二步:查询当前ul下的所有li节点 $liList = $xpath->query('./li', $ulNode); foreach ($liList as $liNode) { $liText = trim($liNode->nodeValue); // 按冒号拆分键值对,第二个参数限制仅拆分一次,避免值内包含冒号导致拆分错误 $splitRes = explode(':', $liText, 2); if (count($splitRes) === 2) { // 统一键名小写,可按需修改为你需要的键名映射规则 $key = strtolower(trim($splitRes[0])); $eventItem[$key] = trim($splitRes[1]); } } $logisticsData[] = $eventItem; } // 输出结构化结果 print_r($logisticsData); ?>
适配特殊场景说明
- 如果你的li标签自带对应字段的class属性(比如
<li class="status">已揽收</li>),可以直接替换li查询逻辑,不用拆分文本,稳定性更高:// 示例:直接按class取对应字段值 $eventItem['status'] = trim($xpath->query('./li[contains(@class, "status")]', $ulNode)->item(0)?->nodeValue ?? ''); $eventItem['data'] = trim($xpath->query('./li[contains(@class, "data")]', $ulNode)->item(0)?->nodeValue ?? ''); - 代码默认键名是li内冒号前的文本转小写,如果你需要自定义键名映射,可以增加映射数组处理:
$keyMap = [ '状态' => 'status', '日期' => 'data', '时间' => 'hora' ]; $key = $keyMap[trim($splitRes[0])] ?? strtolower(trim($splitRes[0]));
运行后生成的数组结构示例:
Array ( [0] => Array ( [status] => 包裹已出库 [data] => 2024-06-10 [hora] => 16:42 [origem] => 杭州仓储中心 ) [1] => Array ( [status] => 运输中 [data] => 2024-06-11 [hora] => 08:25 [destino] => 上海闵行配送站 ) )
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

