jae-jae / QueryList

:spider: The progressive PHP crawler framework! 优雅的渐进式PHP采集框架。
https://querylist.cc
2.65k stars 440 forks source link

在某些情况下,html(setHtml)会有问题 #114

Closed aboutboy closed 4 years ago

aboutboy commented 4 years ago

比如这里:http://xiaohua.zol.com.cn/lengxiaohua/34.html 我setHtml后,发现html的内容被破坏了,少了一个导致DOM无法解析,如下:

\n \n
\n
\n
  • \n \n 最爱冷笑话,开心还能练大脑\n
    来源:笑话集
    \n
    \n 在
  • \n这一句本来前面还应该有个
  • ,结果setHtml后这个不见了。。 我的代码片段: $listql = $ql->myGet($listurl,[],$options); $listql->use(AbsoluteUrl::class); if($charset != 'utf-8'){ $listhtml = Http::get($listurl,[],$options)->body(); //dump($listhtml); $listhtml = mb_convert_encoding($listhtml,'UTF-8','GBK'); //dump($listhtml); $listhtml = preg_replace('/]*charset[^<>]*?>/i', '', $listhtml); dump($listhtml);//在这里打印还是正常的,有 $listql->setHtml($listhtml); } if ($listql->getHtml() == ''){ continue; } dump($listql);//这里打印就发现有一个节点少了,然后下一句就出错了 $listdata = $listql->absoluteUrl($listurl)->rules($listrule)->range($listrange)->query()->getData(); 错误日志: ErrorException DOMXPath::query(): Invalid expression at vendor/jaeger/phpquery-single/phpQuery.php:1765 1761| ? '//*' 1762| : $xpath.$XQuery; 1763| $this->debug("XPATH: {$query}"); 1764| // run query, get elements > 1765| $nodes = $this->xpath->query($query); 1766| $this->debug("QUERY FETCHED"); 1767| if (! $nodes->length ) 1768| $this->debug('Nothing found'); 1769| $debug = array();
    aboutboy commented 4 years ago

    进一步的研究参考这里:https://segmentfault.com/q/1010000023035809

    jae-jae commented 4 years ago

    这是一个phpQuery的已知问题,phpQuery 解析内容时当遇到一些特殊字符会导致内容被截断,如某些繁体字,一种解决方法是将导致内容截断的特殊字符替换掉然后再将HTML传给QueryList解析

    aboutboy commented 4 years ago

    image 果然是特殊符号导致的。不过一个尖括号就导致了错误,也太脆弱了。。 我再研究下怎么面对这种特殊情况。

    建议:querylist解析规则时最好做异常处理。