$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://qn.quotidiano.net/ultimora.php?news=135315570352&a=2012&m=11&g=17");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$htmls = curl_exec($ch);
curl_close($webch);
$htmls = utf8_encode(mb_convert_encoding($htmls, 'auto', 'UTF-8'));
//自动转换成utf8格式
libxml_use_internal_errors(true);
//去除dom保错
$dom = new DOMDocument('1.0', 'utf-8');
//声明DOM为utf8格式
@$dom->loadHTML($htmls);
$script_tags = $dom->getElementsByTagName('script');
$length = $script_tags->length;
for ($i = 0; $i < $length; $i++) {
  $script_tags->item(0)->parentNode->removeChild($script_tags->item(0));
}
//查找script标签并去除
$dom->formatOutput = true;
$htmls = $dom->saveHTML();
//保存dom
echo $htmls;一个奇怪的问题,用DOM分析HTML源码,去除script标签,居然出现错误,很多GOOGLE ADS的代码被打印了出来,究竟是什么原因?如何解决?大家帮忙一下。

解决方案 »

  1.   

    js 中的 html 标记串造成了 DOM 解析错误
    虽然是 loadHTML,但也只是不严格检查标记的封闭性,并不会去做 js 的语法检查
      

  2.   

    关键是html并不是很严谨的标签语法——为什么这么糟糕?这恰恰html5复辟,推倒xhtml的理由
    有兴趣去查查html5的产生历史(html4是w3c产物,html5是w3c被迫接受的产物)
    最好能确定或者转化为严格的标签再做dom
    转化用tidy是一个好的选择,但本人测试也有出错严重的情况(估计你的例子tidy也处理得不好,但可以试试)
    试用过多个DOM方式解析html的相关项目产品,暂时容错性最好的是simple html dom
      

  3.   

    ok, 先去掉 //comment() ,然后再script。