Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DOMDocument.loadHTML, Опять кодировки 
:(
    Опции темы
Лёша Тёмный
  Дата 2.11.2005, 19:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проблема такая:
Есть 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 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



Код

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



--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Kostuch
Дата 6.12.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.9.2007
Где: Ukraine, Kiev

Репутация: нет
Всего: нет



Аналогично и у меня, но незнаю помогло ли человеку что тут написал Ваша строчка мне не помогла... у меня есть такой вот файлик (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;
}

PM MAIL WWW ICQ YIM   Вверх
Kostuch
Дата 14.12.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.9.2007
Где: Ukraine, Kiev

Репутация: нет
Всего: нет



и тишинаааа.............
Неужели никто не пользовался ?

Это сообщение отредактировал(а) Kostuch - 14.12.2007, 10:29
PM MAIL WWW ICQ YIM   Вверх
Ruzzz
Дата 12.6.2009, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.3.2008

Репутация: 1
Всего: 1



А проблема то до сих пор smile Кто нибудь может подсказать решение?
PM MAIL   Вверх
Ruzzz
Дата 12.6.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.3.2008

Репутация: 1
Всего: 1



вот решение: Функция подготовки 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');


Это сообщение отредактировал(а) Ruzzz - 12.6.2009, 14:09
PM MAIL   Вверх
patt
Дата 21.9.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.11.2004
Где: Николаев

Репутация: нет
Всего: 2



Ruzzz, спасибо за готовое решение, подозревал, что DOMDocument не осилил правильно распарсить документ и поэтому не шарит какую кодировку ставить, но мысль писать это самому нагояло тоску.... это + smile
PM MAIL ICQ Skype GTalk   Вверх
HongKilDong
Дата 21.5.2010, 09:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



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

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


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

PM MAIL   Вверх
Luckylad
Дата 27.9.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2005
Где: Саратов/Россия

Репутация: нет
Всего: нет



Ruzzz
cпасибо, ваш код мне помог!
PM MAIL WWW Skype   Вверх
akazakou
Дата 9.1.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.1.2013

Репутация: нет
Всего: нет



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

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


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

Спасибо мужик! Полдня мучался с вопросом, почему так происходит! 
PM MAIL   Вверх
night00
Дата 15.6.2013, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



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

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


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

Спасибо, помогло!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: X технологии | Следующая тема »


 




[ Время генерации скрипта: 0.1418 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.