XPath提取无序列表为多维数组指南
作者:水悠悠予安
时间:2025-08-20
浏览:0
本文档旨在指导开发者如何使用PHP的DOMDocument和DOMXPath类,将包含状态信息的HTML无序列表结构转换为结构化的多维数组。通过使用XPath查询和数据提取,可以将网页中类似物流跟踪信息的列表转换为易于处理的JSON格式数据,方便后续的数据分析和应用。

本文档旨在指导开发者如何使用 PHP 的 DOMDocument 和 DOMXPath 类,将包含状态信息的 HTML 无序列表结构转换为结构化的多维数组。通过使用 XPath 查询和数据提取,可以将网页中类似物流跟踪信息的列表转换为易于处理的 JSON 格式数据,方便后续的数据分析和应用。
准备工作
首先,确保你的 PHP 环境已经安装并启用了 DOMDocument 和 DOMXPath 扩展。这两个扩展通常是 PHP 默认安装的一部分,但如果遇到问题,可能需要手动启用。
代码实现
以下代码演示了如何将 HTML 字符串转换为多维数组,并最终输出为 JSON 格式。
preserveWhiteSpace = false;
@$domd->loadHTML('' . $html, $flags);
$removeAnnoyingWhitespaceTextNodes = function (\DOMNode $node) use (&$removeAnnoyingWhitespaceTextNodes): void {
if ($node->hasChildNodes()) {
for ($i = $node->childNodes->length - 1; $i >= 0; --$i) {
$removeAnnoyingWhitespaceTextNodes($node->childNodes->item($i));
}
}
if ($node->nodeType === XML_TEXT_NODE && !$node->hasChildNodes() && !$node->hasAttributes() && ! strlen(trim($node->textContent))) {
$node->parentNode->removeChild($node);
}
};
$removeAnnoyingWhitespaceTextNodes($domd);
return $domd;
}
$html = <<
- Status: Objeto em trânsito - por favor aguarde
- Data : 24/10/2021 | Hora: 12:04
- Origem: Unidade de Tratamento - Jaboatao Dos Guararapes / PE
- Destino: Agência dos Correios - Cuitegi / PB
- Status: Objeto em trânsito - por favor aguarde
- Data : 19/10/2021 | Hora: 00:03
- Origem: Unidade de Logística Integrada - Curitiba / PR
- Destino: Unidade de Tratamento - Recife / PE
- Status: Fiscalização aduaneira finalizada
- Data : 18/10/2021 | Hora: 23:35
- Local: Unidade Operacional - Curitiba / PR
- Status: Objeto recebido pelos Correios do Brasil
- Data : 16/10/2021 | Hora: 11:45
- Local: Unidade de Logística Integrada - Curitiba / PR
- Status: Objeto postado
- Data : 14/10/2021 | Hora: 20:30
- Local: País - /
代码解释:
- 加载 HTML 并创建 DOMXPath 对象:
- 使用 DOMDocument 加载 HTML 字符串。
- 创建 DOMXPath 对象,用于执行 XPath 查询。
- 使用 loadHTML_noemptywhitespace 函数加载HTML,该函数可以移除HTML中的空白节点,避免干扰XPath查询结果。
- 使用 XPath 查询 ul 元素:
- $xp->query("//div[contains(@class,'singlepost')]/ul") 使用 XPath 表达式选择所有 class 包含 singlepost 的 div 元素下的所有 ul 元素。
- 循环遍历 ul 元素,提取数据:
- 外层 foreach 循环遍历每个 ul 元素。
- 内层 foreach 循环遍历每个 li 元素。
- explode(":",$li->nodeValue, 2) 使用冒号分割 li 元素的文本内容,得到键值对。
- trim() 函数用于去除键和值两端的空格。
- 格式化 JSON 输出:
- json_encode_pretty() 函数用于格式化 JSON 输出,使其更易读。
输出结果:
[
{
"Status": "Objeto em trânsito - por favor aguarde",
"Data": "24/10/2021 | Hora: 12:04",
"Origem": "Unidade de Tratamento - Jaboatao Dos Guararapes / PE",
"Destino": "Agência dos Correios - Cuitegi / PB"
},
{
"Status": "Objeto em trânsito - por favor aguarde",
"Data": "19/10/2021 | Hora: 00:03",
"Origem": "Unidade de Logística Integrada - Curitiba / PR",
"Destino": "Unidade de Tratamento - Recife / PE"
},
{
"Status": "Fiscalização aduaneira finalizada",
"Data": "18/10/2021 | Hora: 23:35",
"Local": "Unidade Operacional - Curitiba / PR"
},
{
"Status": "Objeto recebido pelos Correios do Brasil",
"Data": "16/10/2021 | Hora: 11:45",
"Local": "Unidade de Logística Integrada - Curitiba / PR"
},
{
"Status": "Objeto postado",
"Data": "14/10/2021 | Hora: 20:30",
"Local": "País - /"
}
]注意事项
- HTML 结构: 此代码依赖于特定的 HTML 结构。如果 HTML 结构发生变化,XPath 表达式可能需要进行调整。
- 错误处理: 在实际应用中,应该添加适当的错误处理机制,例如检查 DOMDocument::loadHTML() 是否成功加载 HTML,以及 DOMXPath::query() 是否返回了预期的结果。
- 编码问题: 确保 HTML 字符串的编码与 PHP 脚本的编码一致,以避免出现乱码问题。通常建议使用 UTF-8 编码。
- XPath 表达式: 编写正确的 XPath 表达式是至关重要的。可以使用浏览器开发者工具或在线 XPath 测试工具来验证 XPath 表达式的正确性。
- 数据清洗: 在提取数据后,可能需要进行进一步的数据清洗,例如去除多余的空格、转换日期格式等。
总结
本文档提供了一个使用 PHP 的 DOMDocument 和 DOMXPath 类将 HTML 无序列表转换为多维数组的示例。通过使用 XPath 查询和数据提取,可以将网页中的结构化数据转换为易于处理的格式。在实际应用中,需要根据具体的 HTML 结构和需求进行适当的调整和优化。
作者最新文章
灵活计算器
2026-09-16 17:45
苹果折叠屏iPhone预计售价是多少
2026-09-14 13:44
OpenAI GPT-6 Astra 自主通关《传送门》:技术原理与实验成本解析
2026-09-08 19:08
苹果与铠侠签署NAND长期供应协议:3-5年长约与不设价格上限背后的供应链战略
2026-09-08 16:58
PDF转PPT操作指南:在线、本地与批量转换及结果核对
2026-09-04 15:04
上一篇:
Win10文件无法删除解决方法分享
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































