Парсинг html (кодировка)

parks

Постоялец
Регистрация
18 Сен 2008
Сообщения
439
Реакции
100
Есть скрипт
PHP:
<?php
$html =  file_get_contents ( 'http://www.olimpkino.dp.ua/' );
    /** создаем новый dom-объект **/
    $dom = new domDocument;

    /** загружаем html в объект **/
    @$dom->loadHTML($html);
    $dom->preserveWhiteSpace = false;

    /** элемент по тэгу **/
    $tables = $dom->getElementsByTagName('table');

    /** получаем все строки таблицы **/
    $rows = $tables->item(0)->getElementsByTagName('tr');

    /** цикл по строкам **/
    foreach ($rows as $row)
    {
        /** все ячейки по тэгу **/
        $cols = $row->getElementsByTagName('td');
        /** выводим значения **/
        echo $cols->item(0)->nodeValue.'<br>';
        echo $cols->item(1)->nodeValue.'<br>';
        echo '<hr>';
    }
?>
В итоге получается половона нормального текста а половина каракуль
В ролях:
Джонни Депп, Анджелина Джоли, Пол Беттани и др.

Описание:
Джонни Депп играет американского туриста, чей легкий флирт с незнакомкой приводить его в самый центр паутины интриг, страстей и опасности. Во время экспромтной поездки в Европу для того, чтобы излечить свое разбитое сердце, Френк (Депп) случайно встречает очень необычную ж�... подробнее...

20.01 - 09.02
"Самый лучший фильм в 3-ДÐ" (Самый лучший фильм в 3-ДÐ) цена билетов Большой зал: 15:00, 17:00, 19:00, 21:00 (сеансы на 2 февраля) Малый зал: 11:00, 13:00 (сеансы на 2 февраля) Жанр: комедия В ролях: Гарик Харламов, Александр Балуев, Александр Семчев и др. Ограничение: до 16 лет Описание: Макс Утесов — недооцененный режиссер-любитель. Утесов снимает свои фильмы на любительскую камеру. В это же время российские киноакадемики проводят конкурс «Самый лучший фильм России», в финал которого вышли 7 известнейших кинокартин. До церемонии объявления победителя кÐ... подробнее...
Ну и естественно хотелось бы это исправить.
 
Непонятно откуда этот текст берется?! Я не нашел его на главной olimpkino.dp.ua/
Если с главной. То они не ту функцию используют для обрезания ютф8 строки и получается такая белеберда
Код:
ж�...     подробнее...
iconv конечно вариант, но не хороший, т.к. класс domDocument должен возвращать все в одной кодировке, а не в разных

UPD:
попробуй
PHP:
new domDocument('1.0', 'UTF-8')
 
Непонятно откуда этот текст берется?! Я не нашел его на главной olimpkino.dp.ua/
Если с главной. То они не ту функцию используют для обрезания ютф8 строки и получается такая белеберда
Код:
ж�...     подробнее...
iconv конечно вариант, но не хороший, т.к. класс domDocument должен возвращать все в одной кодировке, а не в разных
UPD:
попробуй
PHP:
new domDocument('1.0', 'UTF-8')
К сожалению нечего помогло , наверно и вправду дело в обрезании текста , т.к каракули появляются после �...
 
Ваш php файл, перекодируйте в utf-8. Удобно это делать в notepad++
 
К сожалению нечего помогло , наверно и вправду дело в обрезании текста , т.к каракули появляются после �...
Так и есть, если убрать �..., то все нормально.
PHP:
<?php 
$html =  file_get_contents ( 'http://www.olimpkino.dp.ua/' ); 
$html = preg_replace("'\..*?\.\.\.&nbsp'", "...&nbsp", $html); //Обрезает последние предложения в описании. 
  $dom = new domDocument; 
    @$dom->loadHTML($html); 
    $dom->preserveWhiteSpace = false; 
    $tables = $dom->getElementsByTagName('table'); 
    $rows = $tables->item(0)->getElementsByTagName('tr'); 
    foreach ($rows as $row) 
    { 
        $cols = $row->getElementsByTagName('td'); 
        echo $cols->item(0)->nodeValue.'<br>'; 
        echo $cols->item(1)->nodeValue.'<br>'; 
        echo '<hr>'; 
    } 
?>
 
Так и есть, если убрать �..., то все нормально.
PHP:
<?php 
$html =  file_get_contents ( 'http://www.olimpkino.dp.ua/' ); 
$html = preg_replace("'\..*?\.\.\.&nbsp'", "...&nbsp", $html); //Обрезает последние предложения в описании. 
  $dom = new domDocument; 
    @$dom->loadHTML($html); 
    $dom->preserveWhiteSpace = false; 
    $tables = $dom->getElementsByTagName('table'); 
    $rows = $tables->item(0)->getElementsByTagName('tr'); 
    foreach ($rows as $row) 
    { 
        $cols = $row->getElementsByTagName('td'); 
        echo $cols->item(0)->nodeValue.'<br>'; 
        echo $cols->item(1)->nodeValue.'<br>'; 
        echo '<hr>'; 
    } 
?>
Спасибо разобрался , а как нащот этого здесь всё в крокозяблах....
 
К сожалению нечего помогло , наверно и вправду дело в обрезании текста , т.к каракули появляются после �...

поставь вместо
PHP:
new domDocument('1.0', 'UTF-8')


вот это:

PHP:
new domDocument('1.0', 'windows-1251')
и не должно быть каракуль
 
По непонятным причинам класс domdocument каждый байт в hex D0 превращал в C390, D1 -> C391 ну и собсно все остальные русские символы превращались в нечитабельный utf8. Не вдаваясь особо в шестнадцатиричную арифметику составил табличку.
Для данного случая возьми на вооружение функцию:
PHP:
function to_norm_utf8($str){
    $table = array(
"\xC3\x90\xC2\xA0"=>"\xD0\xA0", "\xC3\x90"=>"\xD0", "\xC3\x91"=>"\xD1", "\xC3\x92"=>"\xD2", "\xC2\x91"=>"\xD1",
    "\xC2\x90"=>"\x90", "\xC2\x91"=>"\x91", "\xC2\x92"=>"\x92", "\xC2\x93"=>"\x93", "\xC2\x94"=>"\x94",
 "\xC2\x95"=>"\x95", "\xC2\x81"=>"\x81", "\xC2\x96"=>"\x96", "\xC2\x97"=>"\x97", "\xC2\x98"=>"\x98",
 "\xC2\x99"=>"\x99", "\xC2\x9A"=>"\x9A", "\xC2\x9B"=>"\x9B", "\xC2\x9C"=>"\x9C", "\xC2\x9D"=>"\x9D",
 "\xC2\x9E"=>"\x9E", "\xC2\x9F"=>"\x9F", "\xC2\xA1"=>"\xA1", "\xC2\xA2"=>"\xA2", "\xC2\xA3"=>"\xA3",
 "\xC2\xA4"=>"\xA4", "\xC2\xA5"=>"\xA5", "\xC2\xA6"=>"\xA6", "\xC2\xA7"=>"\xA7", "\xC2\xA8"=>"\xA8",
 "\xC2\xA9"=>"\xA9", "\xC2\xAC"=>"\xAC", "\xC2\xAA"=>"\xAA", "\xC2\xAB"=>"\xAB", "\xC2\xAD"=>"\xAD",
 "\xC2\xAE"=>"\xAE", "\xC2\xAF"=>"\xAF", "\xC2\x86"=>"\x86", "\xC2\x87"=>"\x87", "\xC2\x84"=>"\x84",
 "\xC2\x90"=>"\x90", "\xC2\xB0"=>"\xB0", "\xC2\xB1"=>"\xB1", "\xC2\xB2"=>"\xB2", "\xC2\xB3"=>"\xB3",
 "\xC2\xB4"=>"\xB4", "\xC2\xB5"=>"\xB5", "\xC2\x91"=>"\x91", "\xC2\xB6"=>"\xB6", "\xC2\xB7"=>"\xB7",
 "\xC2\xB8"=>"\xB8", "\xC2\xB9"=>"\xB9", "\xC2\xBA"=>"\xBA", "\xC2\xBB"=>"\xBB", "\xC2\xBC"=>"\xBC",
 "\xC2\xBD"=>"\xBD", "\xC2\xBE"=>"\xBE", "\xC2\xBF"=>"\xBF", "\xC2\x80"=>"\x80", "\xC2\x81"=>"\x81",
 "\xC2\x82"=>"\x82", "\xC2\x83"=>"\x83", "\xC2\x84"=>"\x84", "\xC2\x85"=>"\x85", "\xC2\x86"=>"\x86",
 "\xC2\x87"=>"\x87", "\xC2\x88"=>"\x88", "\xC2\x89"=>"\x89", "\xC2\x8C"=>"\x8C", "\xC2\x8A"=>"\x8A",
 "\xC2\x8B"=>"\x8B", "\xC2\x8D"=>"\x8D", "\xC2\x8E"=>"\x8E", "\xC2\x8F"=>"\x8F", "\xC2\x96"=>"\x96",
 "\xC2\x97"=>"\x97", "\xC2\x94"=>"\x94", "\xC2\x91"=>"\x91", "\xC2\xA0"=>"\x20");
    $str = strtr($str, $table);//все &nbsp; станут пробелами -> " "
    return $str;
}
Использовать например вот так:
PHP:
echo to_norm_utf8($cols->item(1)->nodeValue).'<br>';
Символы, которые я использовал для составления этой таблицы:
Код:
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯІЇЄҐабвгдеёжзийклмнопрстуфхцчшщьъыэюяіїєґ
Т.е. всякие (c) (r) и прочие спецсимволы, кроме !"№;%:?... - нужно добавлять в таблицу.
 
По непонятным причинам класс domdocument каждый байт в hex D0 превращал в C390, D1 -> C391 ну и собсно все остальные русские символы превращались в нечитабельный utf8. Не вдаваясь особо в шестнадцатиричную арифметику составил табличку.
Для данного случая возьми на вооружение функцию:
PHP:
function to_norm_utf8($str){
    $table = array(
"\xC3\x90\xC2\xA0"=>"\xD0\xA0", "\xC3\x90"=>"\xD0", "\xC3\x91"=>"\xD1", "\xC3\x92"=>"\xD2", "\xC2\x91"=>"\xD1",
    "\xC2\x90"=>"\x90", "\xC2\x91"=>"\x91", "\xC2\x92"=>"\x92", "\xC2\x93"=>"\x93", "\xC2\x94"=>"\x94",
 "\xC2\x95"=>"\x95", "\xC2\x81"=>"\x81", "\xC2\x96"=>"\x96", "\xC2\x97"=>"\x97", "\xC2\x98"=>"\x98",
 "\xC2\x99"=>"\x99", "\xC2\x9A"=>"\x9A", "\xC2\x9B"=>"\x9B", "\xC2\x9C"=>"\x9C", "\xC2\x9D"=>"\x9D",
 "\xC2\x9E"=>"\x9E", "\xC2\x9F"=>"\x9F", "\xC2\xA1"=>"\xA1", "\xC2\xA2"=>"\xA2", "\xC2\xA3"=>"\xA3",
 "\xC2\xA4"=>"\xA4", "\xC2\xA5"=>"\xA5", "\xC2\xA6"=>"\xA6", "\xC2\xA7"=>"\xA7", "\xC2\xA8"=>"\xA8",
 "\xC2\xA9"=>"\xA9", "\xC2\xAC"=>"\xAC", "\xC2\xAA"=>"\xAA", "\xC2\xAB"=>"\xAB", "\xC2\xAD"=>"\xAD",
 "\xC2\xAE"=>"\xAE", "\xC2\xAF"=>"\xAF", "\xC2\x86"=>"\x86", "\xC2\x87"=>"\x87", "\xC2\x84"=>"\x84",
 "\xC2\x90"=>"\x90", "\xC2\xB0"=>"\xB0", "\xC2\xB1"=>"\xB1", "\xC2\xB2"=>"\xB2", "\xC2\xB3"=>"\xB3",
 "\xC2\xB4"=>"\xB4", "\xC2\xB5"=>"\xB5", "\xC2\x91"=>"\x91", "\xC2\xB6"=>"\xB6", "\xC2\xB7"=>"\xB7",
 "\xC2\xB8"=>"\xB8", "\xC2\xB9"=>"\xB9", "\xC2\xBA"=>"\xBA", "\xC2\xBB"=>"\xBB", "\xC2\xBC"=>"\xBC",
 "\xC2\xBD"=>"\xBD", "\xC2\xBE"=>"\xBE", "\xC2\xBF"=>"\xBF", "\xC2\x80"=>"\x80", "\xC2\x81"=>"\x81",
 "\xC2\x82"=>"\x82", "\xC2\x83"=>"\x83", "\xC2\x84"=>"\x84", "\xC2\x85"=>"\x85", "\xC2\x86"=>"\x86",
 "\xC2\x87"=>"\x87", "\xC2\x88"=>"\x88", "\xC2\x89"=>"\x89", "\xC2\x8C"=>"\x8C", "\xC2\x8A"=>"\x8A",
 "\xC2\x8B"=>"\x8B", "\xC2\x8D"=>"\x8D", "\xC2\x8E"=>"\x8E", "\xC2\x8F"=>"\x8F", "\xC2\x96"=>"\x96",
 "\xC2\x97"=>"\x97", "\xC2\x94"=>"\x94", "\xC2\x91"=>"\x91", "\xC2\xA0"=>"\x20");
    $str = strtr($str, $table);//все &nbsp; станут пробелами -> " "
    return $str;
}
Использовать например вот так:
PHP:
echo to_norm_utf8($cols->item(1)->nodeValue).'<br>';
Символы, которые я использовал для составления этой таблицы:
Код:
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯІЇЄҐабвгдеёжзийклмнопрстуфхцчшщьъыэюяіїєґ
Т.е. всякие (c) (r) и прочие спецсимволы, кроме !"№;%:?... - нужно добавлять в таблицу.
А можно выложить эту функцию в составе скрипта , а то меня ошибки уже задолбали .(Кстате в конце нехватает "}")
 
Назад
Сверху