кодировка php DOMXpath - PullRequest
       9

кодировка php DOMXpath

1 голос
/ 25 января 2012

Мне нужно почистить некоторые данные с веб-страниц.Но у меня есть некоторые проблемы с кодированием.

Вот лишь небольшой пример кода, показывающий проблему на хорошо известной немецкой веб-странице.

Я ожидал получить этот текст с веб-страницы:
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>";
}

?>

Ответы [ 2 ]

13 голосов
/ 25 января 2012

html-анализатор DOMDocument (который является libxml2) будет пытаться угадать кодировку ввода, если он сталкивается с искаженным html. Обычно это делает довольно хорошую работу, но эта страница кажется патологическим случаем. Возможно, присутствие восточноазиатских символов сбивает с толку.

В подобных ситуациях, когда вы абсолютно уверены, что знаете кодировку, вы можете принудительно ввести текст в 7-битную ascii перед передачей его в метод loadHTML(). Вы можете сделать это так:

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

Это преобразует все не-ascii символы в html именованный или числовой объект. Страница работает для меня правильно, когда я делаю это.

1 голос
/ 25 января 2012

Сама страница не определяет кодировку так, как ожидает DOMDocument. Например:

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

Вам нужно будет либо исправить патч html перед его загрузкой, либо использовать что-то другое (возможно, loadXML, поскольку он выглядит как документ xhtml?).

...