Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > DOMDocument.loadHTML


Автор: Лёша Тёмный 2.11.2005, 19:24
Проблема такая:
Есть HTML в кодировке windows-1251
Загружаю его в DOMDocument: $xml->loadHTML($text);
Сохраняю ввиде xml: $xml->save("test.xml");
Открываю test.xml в браузере и вижу: часть текста в ввиде кракозябр (Âîññòàíîâëåíèå èíôîðìàöèè), а часть отображается нормально.
Пробовал перед $xml->save вставлять $xml->encoding='utf-8'; // windows-1251, utf-16
в конечном итоге все равно есть кракозябры. Причем всегда каждый тестовый блок либо полностью нормальный либо в крокозябрах smile

Пробовал исходный HTML конвертировать в utf-8 ($text = iconv('windows-1251', 'utf-8', $text)) - тогда вообще весть текст не читаем.


PS: В общем нужно перегнать HTML (с кирилицей в windows-1251) в корректный XML (в любой кодировке windows-1251 или utf-8) для последующей обработки. Если есть другой варинт конвертировать, буду рад рассмотреть.

Автор: Diesel Draft 22.5.2007, 23:22
Код

$xml = new DOMDocument('1.0', 'windows-1251');

Автор: Kostuch 6.12.2007, 16:48
Аналогично и у меня, но незнаю помогло ли человеку что тут написал Ваша строчка мне не помогла... у меня есть такой вот файлик (http://files.kostya.net.ua/ftp/otovs.htm) и такой вот код в ПХП, выдает те самые каракули :( 
Код

$html=file_get_contents("arc/200711/1.html");
//$html=iconv('CP1251','UTF-8',$html);
//$html="<html>"
//echo $html;
$doc = new DOMDocument('1.0', 'windows-1251');
$doc->loadHTML($html);
$items=$doc->getElementsByTagName('b');
echo $items->length;
for ($i = 0; $i < $items->length; $i++) {
    $r = $items->item($i)->nodeValue . "<br/>";
    //echo iconv('UTF-8','CP1251',$r);
    echo $r;
}

Автор: Kostuch 14.12.2007, 10:29
и тишинаааа.............
Неужели никто не пользовался ?

Автор: Ruzzz 12.6.2009, 06:56
А проблема то до сих пор smile Кто нибудь может подсказать решение?

Автор: Ruzzz 12.6.2009, 14:08
вот решение: Функция подготовки html-кода для работы с DOM — решает проблемы с кириллицей!

Код
function prepareForDOM($html, $encoding) {
    $html = iconv($encoding, 'UTF-8//TRANSLIT', $html);
    $html = preg_replace('/<(script|style|noscript)\b[^>]*>.*?<\/\1\b[^>]*>/is', '', $html);
    $tidy = new tidy;
    $config = array(
        'drop-font-tags' => true,
        'drop-proprietary-attributes' => true,
        'hide-comments' => true,
        'indent' => true,
        'logical-emphasis' => true,
        'numeric-entities' => true,
        'output-xhtml' => true,
        'wrap' => 0
    );
    $tidy->parseString($html, $config, 'utf8');
    $tidy->cleanRepair();
    $html = $tidy->value;
    $html = preg_replace('#<meta[^>]+>#isu', '', $html);
    $html = preg_replace('#<head\b[^>]*>#isu', "<head>\r\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />", $html);
    return $html;
};

$html = file_get_contents($url);
$html = prepareForDOM($html, 'windows-1251');

$dom = new DOMDocument();
@$dom->loadHTML($html);

// Ну и начинаем работать с DOM
$nodes = $dom->getElementsByTagName('img');

Автор: patt 21.9.2009, 23:42
Ruzzz, спасибо за готовое решение, подозревал, что DOMDocument не осилил правильно распарсить документ и поэтому не шарит какую кодировку ставить, но мысль писать это самому нагояло тоску.... это + smile

Автор: HongKilDong 21.5.2010, 09:40
Есть такая проблема, чуть не поседел пока нашёл решение - перепробовал кучу методов и в моём случае железно сработал такой хак: 
Код

$domDoc->loadHTML('<meta http-equiv="content-type" content="text/html; charset=' . $page_encoding . '">' . $html);


Проверенно при парсинге кода более чем 30 сайтов - работает безотказно. Надеюсь это решение спасёт миллиарды нервных клеток ;)

Автор: Luckylad 27.9.2010, 12:37
Ruzzz
cпасибо, ваш код мне помог!

Автор: akazakou 9.1.2013, 17:13
Цитата(HongKilDong @ 21.5.2010,  09:40)
Есть такая проблема, чуть не поседел пока нашёл решение - перепробовал кучу методов и в моём случае железно сработал такой хак: 
Код

$domDoc->loadHTML('<meta http-equiv="content-type" content="text/html; charset=' . $page_encoding . '">' . $html);


Проверенно при парсинге кода более чем 30 сайтов - работает безотказно. Надеюсь это решение спасёт миллиарды нервных клеток ;)

Спасибо мужик! Полдня мучался с вопросом, почему так происходит! 

Автор: night00 15.6.2013, 13:12
Цитата(HongKilDong @ 21.5.2010,  09:40)
Есть такая проблема, чуть не поседел пока нашёл решение - перепробовал кучу методов и в моём случае железно сработал такой хак: 
Код

$domDoc->loadHTML('<meta http-equiv="content-type" content="text/html; charset=' . $page_encoding . '">' . $html);


Проверенно при парсинге кода более чем 30 сайтов - работает безотказно. Надеюсь это решение спасёт миллиарды нервных клеток ;)

Спасибо, помогло!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)