我需要从网页上抓取一些数据。但我对它有一些编码问题。
这只是一小段示例代码,用来在一个著名的德国网页上显示这个问题。
我原以为会从网页上看到这段文字:
您的位置:我也知道>地区>德国>沃尔夫斯堡>沃尔夫斯堡和VfL。Können dieölner daraus ihren Nutzen ziehen?
但正如你在我的测试中看到的,我得到了这个:
在沃尔夫斯堡的学校里,所有的人都是这样的人,他们的名字是VfL wurde kr?你是不是真的不知道该怎么办?
页面的meta标记表明它是UTF-8编码的……
mb_detect_encoding还说,它是UTF-8。
但是为什么我会收到这条垃圾短信呢?
当我将文本转换为ISO-8859-1时,我得到了预期的结果...
<?php
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
$url = "http://www.goal.com/de/match/60952/wolfsburg-vs-1-fc-k%C3%B6ln/preview";
$fileContent = @file_get_contents($url);
$dom = @DOMDocument::loadHTML($fileContent);
$xpath = new DOMXpath($dom);
$element = $xpath->query(".//*[@id='article_headline']/h2");
if ($element->length > 0) {
$item = $element->item(0);
$text = $item->textContent;
echo $text . "<br>";
$text = iconv("UTF-8", 'ISO-8859-1', $text);
echo $text . "<br>";
}
?>发布于 2012-01-25 10:52:40
如果DOMDocument的html解析器(即libxml2)遇到格式错误的html,它将尝试猜测输入的编码。通常它做得很好,但这个页面似乎是一个病态的案例。也许东亚字符的出现让它感到困惑。
在这样的情况下,您可以在将文本提供给loadHTML()方法之前,将文本强制转换为7位ascii。您可以这样做:
$fileContent = mb_convert_encoding($fileContent, 'HTML-ENTITIES', 'UTF-8');这会将所有非ascii字符转换为html命名或数字字符实体。当我这样做时,页面对我来说工作正常。
发布于 2012-01-25 08:57:55
页面本身并没有像DOMDocument期望的那样定义字符集。例如:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>您需要在加载html之前对其进行修补,或者使用其他东西(可能是loadXML,因为它看起来像是xhtml文档?)。
https://stackoverflow.com/questions/8993747
复制相似问题