php load html,关于php:DOMDocument :: loadHTML():由于输入错误,输入转换失败

我正在寻找使用PHP和CURL的中文网站。 早些时候,我对压缩结果有疑问,因此SO帮助我进行了整理。

现在,在通过PHP-DOMDocument解析内容时遇到了麻烦。

错误如下,

Warning: DOMDocument::loadHTML(): input conversion failed due to input error, bytes 0xE3 0x80 0x90 0xE8 in /var/www/html/ ..

即使发出警告,也无法获得进一步的结果。

我的代码如下所示:

$agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0';

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL,$url);

curl_setopt($curl, CURLOPT_HTTPHEADER, array('text/html; charset=gb2312'));

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);

curl_setopt($curl, CURLOPT_ENCODING,"");  // handling all compressions

curl_setopt($curl, CURLOPT_USERAGENT, $agent);

curl_setopt($curl, CURLOPT_TIMEOUT, 1000);

$html = curl_exec($curl) or die("error:".curl_error($curl));

curl_close($curl);

$htmlParsed = mb_convert_encoding($result,'utf-8','gb2312');

$doc = new DOMDocument();

$doc->loadHTML($htmlParsed);

$xpath = new DOMXpath($doc);

$elements = $xpath->query('//div[@class="test"]//a/@href');

if (!is_null($elements)) {

foreach ($elements as $element) {

echo"
[". $element->nodeName."]";

$nodes = $element->childNodes;

foreach ($nodes as $node) {

echo $node->nodeValue."

";

}

}

}

我在目标网站中找到的内容类型为,

所以我尝试将结果转换为utf-8。

由于输入转换在代码的" DOMDocument :: loadHTML()"行失败,因此我无法解析网页以获取结果。

我目前停留在这一点上,任何帮助或建议将不胜感激。 提前感谢。

(之前我曾经使用过简单的HTML DOM解析器,这非常简单。但是后来在阅读了SO用法方面的缺点之后,我打算切换到PHP的本机DOM解析器)

尝试在加载HTML(即@$doc->loadHTML($htmlParsed);)时抑制错误,这也许是唯一可以接受抑制错误的时间,因为PHP DOM非常非常固定,并且不转换页面,而是按原样加载, 然后尝试消除下一个问题(如果有)。

是的,我曾尝试抑制错误,但无法产生结果。

还要检查您的XPath查询,尝试获取非常简单的内容,然后继续下一个元素。

@ bodi0是的,我尝试了一些非常简单的标签。 :(

了解有关此(bugs.php.net/bug.php?id=47108&edit=3)的PHP错误,您使用的是哪个版本的PHP? 而且,您可以尝试PHP整洁(php.net/manual/en/intro.tidy.php)

@ bodi0 Im使用PHP版本5.3.3

让我们继续聊天中的讨论

我今天看到一个解决方案。

$html=new DOMDocument();

$html_source    = get_html();

$html_source    =mb_convert_encoding( $html_source,"HTML-ENTITIES","UTF-8");

$html->loadHTML( $html_source );

$contents = file_get_contents('xml.xml');

function convert_utf8( $string ) {

if ( strlen(utf8_decode($string)) == strlen($string) ) {

// $string is not UTF-8

return iconv("ISO-8859-1","UTF-8", $string);

} else {

// already UTF-8

return $string;

}

}

$contents = mb_convert_encoding( $contents, mb_detect_encoding($contents),"UTF-8");

$xml = simplexml_load_string(convert_utf8($contents));

print_r($xml);

我只能猜测没有看到正在解析的文档的全部内容,但是如果带有字符编码数据的不在标签之后,则可能是DomDocument使用其默认ISO-8859的情况-1并遇到{字符(gb2312中的前三个"无效"字节),其中0x80字节将是废话的第一位,因为这是ISO-8859-1中未使用的代码点。这可能会触发上面评论中讨论的DomDocument中的错误。如果元素被包含在内容类型元信息之前,则很容易发生。

我唯一想到的就是尝试通过一些准备工作运行html,然后将内容类型的meta标签移到标签之后,以使其使用正确的字符集。如果使用mb_convert_encoding或iconv将编码转换为iso-5589-1或utf-8,请确保您修改了元信息,因为DomDocument不幸地在许多方面都很脆弱。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值