使用QueryList内置的乱码解决方案

使用编码转换插件,设置输入输出编码

$html =<<<STR
<div>
    <p>这是内容</p>
</div>
STR;
$rule = [
    'content' => ['div>p:last','text']
];
$data = QueryList::html($html)->rules($rule)
                ->encoding('UTF-8','GB2312')->query()->getData();

设置输入输出编码,并移除html头部

如果设置输入输出参数仍然无法解决乱码,那就使用 removeHead()方法移除html头部

$html =<<<STR
<div>
    <p>这是内容</p>
</div>
STR;
$rule = [
    'content' => ['div>p:last','text']
];
$data = QueryList::html($html)->rules($rule)
                ->removeHead()->query()->getData();
// 或者
$data = QueryList::html($html)->rules($rule)
                ->encoding('UTF-8','GB2312')->removeHead()->query()->getData();

自己手动转码页面,然后再把页面传给QueryList

$url = 'http://top.etao.com/level3.php?spm=0.0.0.0.Ql86zl&cat=16&show=focus&up=true&ad_id=&am_id=&cm_id=&pm_id=';
//手动转码
$html = iconv('GBK','UTF-8',file_get_contents($url));
$data = QueryList::html($html)->rules([
    "text" => [".title a","text"]
    ])->query()->getData();
print_r($data);

无法获取meta编码,手动转换

在抓取某些网页时,本地是uff-8的,目标页面是utf-8编码,抓过来后以utf-8的编码输出会是乱码。这种情况原因之一就是在抓取目标页面代码时,未能获取到meta中的编码信息时一律转换为ISO-8859-1编码。所以需要手动转一下编码。

$data = $ql::html($html)->rules([
    'title' => ['div[class="novelslistss"]>ul>li>span[class="s2"]>a', 'text', '', function ($content) {
        # 将utf-8 转为 ISO-8859-1
        $content = mb_convert_encoding($content, 'ISO-8859-1', 'utf-8');
        return $content;
    }],                    
])->query()->getData();