1

Webページからいくつかのデータを取得する必要があります。しかし、私はそれにいくつかのエンコーディングの問題があります。

これは、よく知られているドイツのWebページで問題を示すためのほんの少しのサンプルコードです。

私はこのテキストをウェブページから取得することを期待していました:
Alle Kritiker werden gespannt nach Wolfsburg schauen、dennderVfLwurdekräftigumgekrempelt。KönnendieKölnerdarausihrenNutzenziehen?

しかし、私のテストでわかるように、私はこれを取得します:
Alle Kritiker werden gespannt nach Wolfsburg schauen、dennderVfLwurdekräftigumgekrempelt。KönnendieKölnerdarausihrenNutzenziehen?

このページのメタタグは、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

DOMDocument の html パーサー (libxml2) は、不正な形式の html に遭遇した場合、入力のエンコーディングを推測しようとします。通常はかなりうまく機能しますが、このページは病的なケースのようです。おそらく、東アジアのキャラクターの存在が混乱を招いているのでしょう。

このようなエンコーディングが確実にわかっている状況では、テキストをメソッドに渡す前に強制的に 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 をロードする前にパッチを適用するか、何か他のものを使用する必要があります (xhtml ドキュメントのように見えるため、おそらく loadXML ですか?)。

于 2012-01-25T00:57:54.540 に答える