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

Тема в разделе "PHP", создана пользователем parks, 2 фев 2011.

Модераторы: latteo
  1. parks

    parks Нарушитель

    Регистр.:
    18 сен 2008
    Сообщения:
    424
    Симпатии:
    60
    Есть скрипт
    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>';
        }
    ?> 
    В итоге получается половона нормального текста а половина каракуль
    Ну и естественно хотелось бы это исправить.
     
  2. Murdok

    Murdok

    Регистр.:
    1 окт 2006
    Сообщения:
    236
    Симпатии:
    84
    parks нравится это.
  3. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    Непонятно откуда этот текст берется?! Я не нашел его на главной olimpkino.dp.ua/
    Если с главной. То они не ту функцию используют для обрезания ютф8 строки и получается такая белеберда
    Код:
    ж�...     подробнее...
    iconv конечно вариант, но не хороший, т.к. класс domDocument должен возвращать все в одной кодировке, а не в разных

    UPD:
    попробуй
    PHP:
    new domDocument('1.0''UTF-8')
     
    parks нравится это.
  4. parks

    parks Нарушитель

    Регистр.:
    18 сен 2008
    Сообщения:
    424
    Симпатии:
    60
    К сожалению нечего помогло , наверно и вправду дело в обрезании текста , т.к каракули появляются после �...
     
  5. dazed

    dazed

    Регистр.:
    31 мар 2007
    Сообщения:
    208
    Симпатии:
    55
    Ваш php файл, перекодируйте в utf-8. Удобно это делать в notepad++
     
  6. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    319
    Симпатии:
    115
    Так и есть, если убрать �..., то все нормально.
    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>'
        } 
    ?>
     
    parks нравится это.
  7. parks

    parks Нарушитель

    Регистр.:
    18 сен 2008
    Сообщения:
    424
    Симпатии:
    60
    Спасибо разобрался , а как нащот этого
    здесь всё в крокозяблах....
     
  8. Archy1991

    Archy1991 Постоялец

    Регистр.:
    18 янв 2011
    Сообщения:
    99
    Симпатии:
    8
    поставь вместо
    PHP:
    new domDocument('1.0''UTF-8'

    вот это:

    PHP:
    new domDocument('1.0''windows-1251'
    и не должно быть каракуль
     
  9. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    По непонятным причинам класс 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) и прочие спецсимволы, кроме !"№;%:?... - нужно добавлять в таблицу.
     
    parks нравится это.
  10. parks

    parks Нарушитель

    Регистр.:
    18 сен 2008
    Сообщения:
    424
    Симпатии:
    60
    А можно выложить эту функцию в составе скрипта , а то меня ошибки уже задолбали .(Кстате в конце нехватает "}")