昨天querylist在运行的时候,我发现有个列表页http://xiaohua.zol.com.cn/len...
总是报错,其相邻的页面
http://xiaohua.zol.com.cn/len...
http://xiaohua.zol.com.cn/len...
等
却没问题。我在这个出错的页面也没发现有什么问题。因为页面用了gbk编码,用querylist的时候要涉及到setHtml()操作,一旦setHtml()之后,这个页面的数据就会在某个地方丢失一行</li>,然后querylist再执行规则就会报错。
经过研究,我发现这个问题是由querylist引用的phpquery导致的。
为验证这个问题,我直接用phpquery去操作这个页面的html,结果也会丢失</li>。
目前就发现这一个页面有问题:http://xiaohua.zol.com.cn/lengxiaohua/34.html
具体表现为浏览器查看html源代码时,可以看到317行和318行之间少了</li>,这样会导致后续再query的时候出错。
如下:
</div>
>就是这里这里少了一句</li>
<li class="article-summary">
<span class="article-topbar"></span>
<span class="article-title">最爱冷笑话,开心还能练大脑</span>
请高手帮我测试分析下什么原因。
我的代码如下:
<?php
ini_set('display_errors',1); //错误信息
ini_set('display_startup_errors',1); //php启动错误信息
error_reporting(-1);
require('phpQuery/phpQuery.php');
$listurl = 'http://xiaohua.zol.com.cn/lengxiaohua/34.html';
$listhtml = file_get_contents($listurl);
$listhtml = mb_convert_encoding($listhtml,'UTF-8','GBK');
$argv = array("./cli/phpquery","--find",".article-list","--contents");
phpQueryCli($listhtml, array_slice($argv, 1));
function phpQueryCli($markup, $callQueue) {
$pq = phpQuery::newDocument($markup);
$method = null;
$params = array();
foreach($callQueue as $param) {
if (strpos($param, '--') === 0) {
if ($method) {
$pq = call_user_func_array(array($pq, $method), $params);
}
$method = substr($param, 2); // delete --
$params = array();
} else {
$param = str_replace('
', "
", $param);
$params[] = strtolower($param) == 'null'
? null
: $param;
}
}
if ($method)
$pq = call_user_func_array(array($pq, $method), $params);
if (is_array($pq))
foreach($pq as $v)
print $v;
else
print $pq."
";
//var_dump($pq);
}