DOMDocument可解析HTML字符串或文件,结合DOMXPath提取元素,需处理编码避免乱码。1.用loadHTML()加载字符串并禁用隐式标签;2.用loadHTMLFile()读取本地文件或file_get_contents()获取远程内容;3.DOMPXPath支持CSS选择器式查询,如按class或id提取节点;4.中文乱码可通过mb_convert_encoding或添加meta charset解决。

在PHP中读取和解析HTML内容,DOMDocument 是一个非常实用的内置类。它能将HTML字符串或文件加载为结构化的文档对象模型(DOM),便于遍历、修改和提取所需数据。
1. 使用 DOMDocument 加载 HTML 字符串
如果已有HTML内容(如从网络请求获取的页面源码),可以直接用 loadHTML() 方法加载:
$html = ''; $dom = new DOMDocument(); // 加载HTML,禁用内部错误避免警告 libxml_use_internal_errors(true); $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); // 获取所有 p 标签 $paragraphs = $dom->getElementsByTagName('p'); foreach ($paragraphs as $p) { echo $p->nodeValue . "\n"; // 输出:这是第一段 这是第二段 }
注意:使用 LIBXML_HTML_NOIMPLIED 和 LIBXML_HTML_NODEFDTD 可防止自动添加 html、body 等隐式标签,保持原始结构。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
2. 读取本地或远程HTML文件
若需解析本地保存的HTML文件,可用 loadHTMLFile() 方法:
$dom = new DOMDocument();
libxml_use_internal_errors(true);
if ($dom->loadHTMLFile('example.html')) {
$titles = $dom->getElementsByTagName('h1');
foreach ($titles as $title) {
echo $title->nodeValue . "\n";
}
} else {
echo "无法加载文件";
}
对于远程URL,建议先用 file_get_contents() 获取内容再加载:
$url = 'https://example.com/page.html'; $html = file_get_contents($url); $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
3. 提取特定元素(如 class 或 id)
DOMDocument 本身不支持CSS选择器,但可结合 DOMXPath 实现灵活查询:
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($dom);
// 查找 class="content" 的元素
$nodes = $xpath->query('//div[@class="content"]');
foreach ($nodes as $node) {
echo $node->textContent;
}
// 查找 id="main"
$main = $xpath->query('//[@id="main"]')->item(0);
if ($main) {
echo $main->nodeValue;
}
4. 处理中文乱码问题
若HTML含中文出现乱码,确保在加载前声明编码:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
或在HTML开头添加编码声明:
$html = '' . $html;基本上就这些。DOMDocument 配合 DOMXPath 能高效解析结构化HTML,适合做网页抓取、内容提取或模板处理。虽语法略底层,但稳定且无需额外扩展。










