php的DOMDocument读取HTML中文乱码问题

问题

对网页HTML进行简单信息提取,这里不使用正则而使用 PHP 内建对象 DOMDocument 来做分析。
在读取 HTML 片段<div id='chinese'>我是中文</div> 时,出现中文乱码。

问题重现

一段 HTML如下:

<p class='particle'>
    <div id='chinese'>我是中文</div>
</p>

PHP代码如下:

$doc = new DOMDocument();
@$doc->loadHTML($html); // 这里直接$html变量代替
$chinese = $doc->getElementById('chinese');
$result = $doc->saveHTML($chinese);
print_r($result);

输出结果出现不可读乱码。

解决

由于 DOMDocument 的 loadHTML 会遵循 w3c 标准去识别,HTML 片段 缺少 meta 编码标签,所以出现乱码,可通过增加编码标签来修正。

$hackEncoding = '<?xml encoding="UTF-8">';
$doc = new DOMDocument();
@$doc->loadHTML($hackEncoding . $html); // 这里带上encode
$chinese = $doc->getElementById('chinese');
$result = $doc->saveHTML($chinese);
print_r($result);

注:网站不标准时会报 warning 错误,可使用 @ 来屏蔽错误

参考:
http://php.net/domdocument.loadhtml#95251

Author: thinkwei

1 thought on “php的DOMDocument读取HTML中文乱码问题

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注