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

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

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

最近在爬虫某个网站,对于精准的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函数赋值给一个变量的另类用法

<?php   function  go($str) { echo'I\'m '.$str;  }   $goto='go';   $goto('gaojiufeng'...

全方位认识PHP的SESSION

全方位认识PHP的SESSION

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

【二】PHP多进程学习-进程信号管理

【二】PHP多进程学习-进程信号管理

(1).学习目标:    了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习:    (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...

php elasticsearch基础使用

php elasticsearch基础使用

elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{     "require": {        &...

windows安装php event扩展问题

windows安装php event扩展问题

php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...

php redis队列实现秒杀 , php用redis 实现秒杀功能

php redis队列实现秒杀 , php用redis 实现秒杀功能

为什么使用队列?因为pop取队列具有原子性。假如我们需要秒杀一个商品id,我们先将商品的库存保存到一个队列。例如:<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6...