ФорумПрограммированиеPHP для идиотов → Парсинг удалённого сайта. Проблема с кириллицей.

Парсинг удалённого сайта. Проблема с кириллицей.

  • Vans

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 10:28

    Пытаюсь парсить удалённый сайт. Русские символы, если их задавать непосредственно в preg_match, не отображаются в результате.


    $page = file_get_contents($link);
    preg_match("#пиво#u", $page, $arr);


    Выше изложенное выдаёт пустой массив.

    Если тоже самое сделать с обычной строкой и считывать с локального файла, то всё ОК.

    Если необходимо, то прикладываю свой phpinfo().
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2010 г. 10:31, спустя 3 минуты 46 секунд

    Справку забыли вложить
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2010 г. 11:14, спустя 42 минуты 33 секунды

    Русские символы, если их задавать непосредственно в preg_match, не отображаются в результате.
    У Вас венда? Значит Вы пищите, используя cp1251. А значит модификатор u приводит к неверному результату.  
    Спустя 25 сек.
    Верно говоришь
    Спустя 12 сек.
    Всё же склеиваются…
    Сттранный ТС какой-то.
  • Vans

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 11:45, спустя 31 минуту 14 секунд

    Модификатор u убирал и даже при поиске одиночного символа

    <?php

    $page = file_get_contents($link);
    preg_match("#а#",$page,$arr);
    print_r($arr);

    ?>


    Ответ - пустой массив.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 26 февраля 2010 г. 12:52, спустя 1 час 6 минут 36 секунд

    Vans, в какой кодировке документ который парсите? В какой кодировке скрипт?
    Дайте скрипт (сам файл) и дайте документ который парсите, либо ссылку на него
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Vans

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 13:47, спустя 55 минут 30 секунд

    Вот линк http://mob.ua/phone/nokia/nokia_5530_xpressmusic.html
    Сижу под Kubuntu 9.10 с кодировкой UTF-8, LAMP ставил с репозитория через синаптик.
    В случае чего, я прикрепил к первому посту свой phpinfo.
    Необходимо собрать:
    i.Производитель телефона
    ii.Название модели телефона
    iii.GSM/CDMA стандарты
    iv.Тип аккумулятора
    v.Наличие FM-радио
    vi.Количество цветов
  • Vans

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 13:58, спустя 11 минут 8 секунд

    Вот код самого скрипта


    <?php
    setlocale(LC_CTYPE, "ru_RU.CP1251");
    class parsing {

    //получаем ссылки
    function link() {
    //URL страницы для парсинга
    $url="http://mob.ua/phone/";
    //массив, который будет возвращать функция
    $links = array();
    //счётчик для фильтрующего цикла
    $j=0;

    //Если на одной странице 30 товаров, то 100-й будет на 4-й. Парсим 4 страницы
    for ($i=1; $i<=4; $i++) {
    $page = file_get_contents($url."page_".$i);
    preg_match_all('|<h2 class="phone_subtitle"><a href="(.*\.html)">|Uis',$page,$arr);
    //приводим полученый массив ссылок в более приглядный вид, отсекая лишние элементы
    for ($c=0; $c<30;$c++) {
    $links[$j] = $arr[1][$c];
    $j++;
    if ($j>99) break;
    }
    }

    return $links;
    }

    //получаем характеристики со страниц описания
    function feature($link) {
    $page = file_get_contents($link);
    iconv("UTF-8","CP1251", $page);
    //Получаем производителя и название модели
    preg_match_all('|<title>(.+)\s(.+)\s-\s|Uis',$page, $arr);
    $features[0] = $arr[1][0];
    $features[1] = $arr[2][0];
    //Получаем стандарт
    preg_match('#GSM\s\(\d{3,4}.*\)|CDMA\s\(\d{3,4}.*\)#',$page, $arr);
    $features[2] = $arr[0];
    //Получаем инфу о наличии FM-радио
    preg_match('#FM#',$page, $arr);
    $features[3] = $arr[0];
    //Получаем инфу о типе аккумулятора
    preg_match('#Li-Ion.*\d{3,4}.*#', $page, $arr);
    $features[4] = $arr[0];
    //Получаем инфу о кол-ве цветов - Это у меня не получается
    preg_match("#[а-яА-Я]{0,10}#", $page, $arr);
    $features[5] = $arr[0];

    return $features;
    }

    }

    $parse = new parsing;
    $params = $parse->feature('http://mob.ua/phone/nokia/nokia_5530_xpressmusic.html');
    print_r ($params);
    //$links = $parse->link();

    ?>
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2010 г. 14:13, спустя 14 минут 4 секунды

    жесть с кодировками )))
    у тебя небось сам файл в ютф8, ты устанавливаешь локаль сипи1251, сам текст я так понимаю получаешь в сипи1251, пытаешься его пергнать в ютф8 (кстати неправильно, в iconv входящая строка не по ссылке передаётся, должно быть $page = iconv(…, $page);) и потом парсишь регуляркой написанной в ютф8 строку в сипи1251 в скрипте с локалью сипи1251… Есть подозрение что тут что-то нетак =)
    Не хочешь привести все к одной кодировке, не?
    Ещё, если юзаешь мультибайтовые кодировки, то можно посмотреть в сторону mb_ereg.
    Work, buy, consume, die
  • andrrr

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 14:20, спустя 7 минут 5 секунд

    Прикольно, что при всем этом скрипт работает. гг.

    Array
    (
    [0] => Nokia
    [1] => 5530 XpressMusic
    [2] => GSM (900, 1800, 1900)
    [3] => FM
    [4] => Li-Ion аккумулятор 1000 мАч
    [5] =>
    )



  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 26 февраля 2010 г. 14:23, спустя 3 минуты 23 секунды

    andrrr, ну тогда к чему топик, если все работает?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 26 февраля 2010 г. 14:28, спустя 4 минуты 33 секунды


    andrrr, ну тогда к чему топик, если все работает?
    это воспитание эдво, забей)
    Сапожник без сапог
  • Vans

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 14:32, спустя 4 минуты 40 секунд


    andrrr, ну тогда к чему топик, если все работает?

    Топик к тому, что последний параметр(количество цветов) получить не получается. Если задавать в регулярке любой русский символ результатом будет пустой элемент массива. Если есть альтернатива тому, что я использовал, то подскажите пожалуйста.

    Жесть с кодировками - это да… Но iconv() и setlocale() появились, когда я уже совсем обессилил.
  • andrrr

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 15:09, спустя 37 минут 10 секунд


    // setlocale(LC_CTYPE, "ru_RU.CP1251"); закомментить

    … поскипано …

    function feature($link) {
    $page = file_get_contents($link);
    $page = iconv('windows-1251', 'utf-8', $page);

    … поскипано …

    // Вроде получается
    preg_match('#Экран#', $page, $arr);



    А вообще я сам еще не полностью вкурил специфику работы пхп с кириллицей. Может кто-нибудь придумает лучше, без iconv



    andrrr, ну тогда к чему топик, если все работает?


    Та да, поспешил. Увидел 'аккумулятор' в выводе и обрадовался
  • Vans

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2010 г. 15:18, спустя 8 минут 43 секунды

    andrrr, огромное спасибо, а то я под конец дня уже совсем перестал соображать.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 26 февраля 2010 г. 15:37, спустя 19 минут 2 секунды

    Вас оказывается двое :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!