解决 phpQuery 采集微信公众号乱码问题

用 phpQuery 采集微信公众号文章页的内容是乱码,然而发现这并不是编码的问题,这个网页本来就是 UTF-8,那就真是奇怪了呢… 折腾了很久,也没解决这个问题,最后去看了看网页的源码,发现了…

在源码的起始和结束位置有 <!--headTrap<body></body><head></head><html></html>-->
<!--tailTrap<body></body><head></head><html></html>-->,因为觉得这很奇怪,删掉它再尝试采集,解决了这个问题,如下:

1
2
3
4
5
6
7
8
9
$url = "https://mp.weixin.qq.com/s?src=11&timestamp=1533000601&ver=1031&signature=*LFN6KjIY93ucjNZzMBCspPXRI*0VIxcQpN8alDP5GHZRuSkdqkGT8PlR9ytsfrbLfufk4Fxy3oIWTlGuOpNcj*OjGK9Wf48nFqedKxx6pwXYfTak9*dvH8vgVC7A3xW&new=1";

$html = file_get_contents($url); // 建议用 Curl

$html = str_replace(['<!--headTrap<body></body><head></head><html></html>-->', '<!--tailTrap<body></body><head></head><html></html>-->'], '', $html);

$ql = (new QueryList())->html($html); // 导入 html
$data = $ql->find('#activity-name')->text();
var_dump($data);

我猜想这也许是 phpQuery 加载内容正则表达式根据 <head> 中的标签判断编码失误的问题

开头结尾的 <!--headTrap<body></body><head></head><html></html>--><!--tailTrap<body></body><head></head><html></html>--> 会影响 phpQuery 判断

来感受一下乱码。。。

1
2
3
4
array (size=1)
0 =>
array (size=1)
'title' => string '1603澶���孧H370��棫��硶纭��澶辫��������' (length=152)

关于之前遇到的 phpQuery 编码问题

1
2
3
4
5
// 失败的
->encoding('UTF-8','GB2312')

正常的,在结果集后
echo iconv('GB2312', 'UTF-8', $item['title']);

我是这样解决的:

1
2
3
4
5
6
7
8
9
10
function handleGbkPage($html)
{
$html = mb_convert_encoding($html, 'UTF-8', 'GBK');
$html = preg_replace('/charset=(gb2312|gbk)/is', 'charset=utf-8', $html); // 必须将 <meta/> 中 charset=* 替换为 utf-8,不然 phpQuery 不能解析标签

return $html;
}

$html = handleGbkPage($html);
$ql = (new QueryList())->html($html);

先转码 gbk 为 utf-8 再把 meta 标签 charset=* 替换为 utf-8

https://github.com/jae-jae/QueryList/issues/34

本站文章除注明转载外均为原创,未经允许不要转载哇. ヾ(゚ー゚ヾ) http://qwqaq.com/9fe136ff.html
分享到