【问题标题】:php DOMXpath encodingphp DOMXpath 编码
【发布时间】:2012-01-24 20:35:49
【问题描述】:

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

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

我希望从网页上得到这个文本:
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>";
}

?>

【问题讨论】:

    标签: php encoding domxpath


    【解决方案1】:

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

    在这种情况下,如果您完全确定自己知道编码,则可以在将文本输入loadHTML() 方法之前将其强制转换为 7 位 ascii。你可以这样做:

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

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

    【讨论】:

    • 谢谢,这就是我要找的 :)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多