PHP QUERYLIST 解析DOM 偶尔异常的问题记录
最近在爬虫某个网站,对于精准的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