最近在爬虫某个网站,对于精准的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
header() 函数向客户端发送原始的 HTTP 报头。(官方解释)通俗的讲header函数将参数中的字符串作为服务端的响应头来返回给客户端。什么是服务端的响应头?打开谷歌浏览器看看network中的请求response header信息即可。更多的参数百度response header即可浏览器...
Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...
参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...
经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....
概念请参考w3school文章: redis watch ,redis exec (看完基本秒懂)(1)基本事务://连接本地的 Redis 服务 $redis = new Redis(); $redis->con...
php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...