当前位置:首页 > PHP > 正文内容

PHP QUERYLIST 解析DOM 偶尔异常的问题记录

高老师3年前 (2024-02-03)PHP938

最近在爬虫某个网站,对于精准的class获取元素值某些文章竟然获取失败,例如下面的代码:

// 解析文章内容
$element = QueryList::html($response)->find('.article .content')->eq(0);
$content = $element->html();

理论来讲,稳如老狗,事实上并不是,一直怀疑底层Bug,但是懒得看,后来我想了下唯一可能得原因是字符串编码,于是我对response编码转换为utf8编码:

// 网页内容编码转换
$response = convert_char($response);

然而还是部分解析失败,此时我怀疑是底层bug,但是我觉得这么low的bug不应该,大概率是在DOMElement层获取到的字符编码是utf8,但是response的header中有如下代码:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

DOMElement处理dom节点的时候字符串编码和网页编码不一致可能导致匹配不到节点。以前总是遇到这个问题,逃避很多次,这次终于解决了。一定要保证原始DOM编码规范,header头的编码和DOM编码一致即可。替换下字符串:

// Header标签中编码处理
$response = str_replace('gb2312', 'utf-8', $response);

PHP YYDS

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/721.html

分享给朋友:

“PHP QUERYLIST 解析DOM 偶尔异常的问题记录” 的相关文章

PHP对象转数组

PHP对象转数组

function objtoarr($obj){ $ret = array(); foreach($obj as $key =>$value){ if(gettype($value) == 'arr...

PHP模拟并发请求

PHP模拟并发请求

原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例。文件1:curl.php<?php  $threads=500;//并发请求次数 $url='http://blog.cn/index.php?';...

php多进程,php多进程处理任务,php多进程应用场景

php多进程,php多进程处理任务,php多进程应用场景

php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo//创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不...

全方位认识PHP的SESSION

全方位认识PHP的SESSION

【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...

PHP Warning:  ftok(): Project identifier is invalid

PHP Warning: ftok(): Project identifier is invalid

在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning:  ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....

php mcrypt扩展被废弃的解决方案

php mcrypt扩展被废弃的解决方案

使用openssl扩展对应替换mcrypt的函数,(比较麻烦,但是openssl是未来趋势)在新版php中编译mcrypt扩展使用一个纯php代码实现的mcrypt扩展库,git地址为https://github.com/phpseclib/mcrypt_compat,每个mcrypt的方法都已经实...