1

我需要从网页中抓取一些数据。但我有一些编码问题。

这里只是一个小示例代码,用于在一个著名的德国网页上显示该问题。

我希望从网页上得到这个文本:
Alle Kritiker werden gespannt nach Wolfsburg schauen,denn der VfL wurde kräftig umgekrempelt。Können die Kölner daraus ihren Nutzen ziehen?

但正如你在我的测试中看到的那样,我得到了这个:
Alle Kritiker werden gespannt nach Wolfsburg schauen,denn der VfL wurde kräftig umgekrempelt。Können die Kölner daraus ihren Nutzen ziehen?

页面的元标记说,它是 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>";
}

?>
4

2 回答 2

14

如果遇到格式错误的 html,DOMDocument 的 html 解析器(即 libxml2)将尝试猜测输入的编码。通常它做得很好,但这个页面似乎是一个病态的案例。也许东亚字符的存在使它感到困惑。

在这种情况下,您绝对确定您知道编码,您可以将文本强制转换为 7 位 ascii,然后再将其提供给loadHTML()方法。你可以这样做:

$fileContent = mb_convert_encoding($fileContent, 'HTML-ENTITIES', 'UTF-8');

这会将所有非 ascii 字符转换为 html 命名或数字字符实体。当我这样做时,该页面对我来说正常工作。

于 2012-01-25T02:52:40.147 回答
1

页面本身并没有像 DOMDocument 期望的那样定义字符集。例如:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

您需要在加载 html 之前对其进行修补,或者使用其他东西(可能是 loadXML,因为它似乎是一个 xhtml 文档?)。

于 2012-01-25T00:57:54.540 回答