DOMDocument :: loadHTML():由于输入错误导致输入转换失败
我正在寻找使用PHP和CURL取消 中文网站 。 早些时候,我遇到了一个压缩结果的问题,所以我帮助我整理了一下。 现在,我在通过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 "<br/>[". $element->nodeName. "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "n";
}
}
}
我在我的目标网站上找到了内容类型,
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
所以我尝试将结果转换为utf-8。
由于输入转换在代码的'DOMDocument :: loadHTML()'行失败,我无法解析网页以获取结果。 我目前坚持在这一点上,任何帮助或建议将不胜感激。 提前Thanx。
(之前我曾经用简单的HTML DOM解析器工作,这很简单。但后来在阅读关于其用法的SO之后。我计划切换到PHP的本地DOM解析器)
我今天看到一个解决方案。
$html=new DOMDocument();
$html_source = get_html();
$html_source =mb_convert_encoding( $html_source, "HTML-ENTITIES", "UTF-8");
$html->loadHTML( $html_source );
如果没有看到你正在解析的文档的完整头部,我只能猜测,但是如果字符编码数据不是直接位于标签后面,那么您可能会遇到DomDocument正在使用其默认ISO-8859的情况-1并且运行到【字符(gb2312中的前三个“无效”字节),其中0x80字节将是第一个无意义的位,因为这是ISO-8859-1中未使用的代码点。 这可能会触发上述评论中讨论的DomDocument中的错误。 如果元素包含在内容类型元信息之前,很容易发生。
我能想到的唯一的尝试就是通过一些准备工作来运行html,并将该内容类型元标记移动到标记之后,以尝试使其使用正确的字符集。 如果使用mb_convert_encoding或iconv将编码转换为iso-5589-1或utf-8,请确保您修改元信息,因为DomDocument在许多方面不幸很脆弱。
<?php
$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);
链接地址: http://www.djcxy.com/p/29861.html
上一篇: DOMDocument::loadHTML(): input conversion failed due to input error