【发布时间】:2014-06-15 03:23:57
【问题描述】:
我希望使用 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 "<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()”行输入转换失败,我无法解析网页以获取结果。 我目前被困在这一点上,任何帮助或建议将不胜感激。提前谢谢。
(之前我使用简单的 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 tidy (php.net/manual/en/intro.tidy.php)
标签: php parsing dom curl web-scraping