При парсинге на одинаковых тегах часть данных пропадает

322
02 сентября 2017, 00:09

Делаю задание по парсингу данных со специального сайта с крайне непонятным движком внутри. Новость выводится в своем теге(он всегда одинаков), я делаю это этим кодом:

<?php
$ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, 'http://24gadget.ru/'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec($ch); 
    curl_close($ch);

    //Выделение новостных блоков
    preg_match_all("~<article class=\"news-announce\">(.*?)</article>~is",$result,$post);

        //Перебираем массив и делим по новостям
        foreach ($post[0] as $news){

            //Удаляем ненужное в блоках
            $news = preg_replace("'<div class=\"announce-links clearfix\">.*?</div>'si","",$news);

            //Получаем ссылку на изображение
            preg_match("~<img[^>]*?>~",$news,$img);
            $img = strstr($img[0], '/uploads/');
            $img = strstr($img, '" alt', true);
            $img = "http://24gadget.ru".$img;

            //Удаляем ненужное в блоках
            $news = preg_replace("'<div class=\"announce-text clearfix\">.*?</div>'si","",$news);
            $news = preg_replace("'\(.*?\)'si","",$news);
            $news = strip_tags($news, '<span><a><div><article>');

            //Выделяем ссылку
            $link = strstr($news, 'http');
            $link = strstr($link, '" class', true);

            //Выделяем дату и название
            preg_match("~<a[^>]*?>(.*)</a>~",$news,$article);
            preg_match("~<span[^>]*?>(.*)</span>~",$news,$date);

            //Ищем, сегодняшняя ли новость
            $pos = strpos($date[1], 'Вчера');
                //Если да, то обрабатываем ссылку
                if($pos === false){}
                else {

                    //Получаем дату для сравнений времени
                    $date = intval(str_replace(':', '', strstr($date[1], ' ')));

                    //Запрос самой новости
                    $ch = curl_init();  
                    curl_setopt($ch, CURLOPT_URL, $link); 
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
                    $result = curl_exec($ch); 
                    curl_close($ch);

                    //Выделяем текст статьи
                    preg_match_all("~<article class=\"news-announce\">(.*?)</article>~is",$result,$text);


                    //Убираем вееесь шлак в статье оставив только текст
                    $text = $text[0][0];
                    $text = preg_replace("'<div align=\"center\">.*?</div>'si","",$text);
                    $text = preg_replace("'<script[^>]*?>.*?</script>'si","",$text);
                    $text = preg_replace("'<h1[^>]*?>.*?</h1>'si","",$text);
                    $text = preg_replace("'<div class=\"announce-meta clearfix\">.*?</div>'si","",$text);
                    $text = preg_replace("'<div class=\"big-share\">.*?</div>'si","",$text);
                    $text = preg_replace("'<div class=\"announce-tags clearfix\">.*?</div>'si","",$text);
                    $text = preg_replace("'<div style=\".*?\">.*?</div>'si","",$text);
                    $text = preg_replace("'<!--.*?-->'si","",$text);
                    $text = preg_replace("'<img[^>]*?>'si","",$text);
                    $text = preg_replace('/(<br[^>]*>\s*)+/i','',$text);
                    $text = strstr($text, 'Источник', true);
                    $text = strip_tags($text, '');
                    $text = preg_replace('/\\r\\n?|\\n/', '', $text);

                    //Убираем все пробелы в начале
                    $text = ltrim($text);
                            $arr = array($link, $date, $article[1], $text, $img);
                            $end[] = $arr;
                            $arr = array();


                }
        }

        usort($end, function($a, $b){
            return ($a['1'] - $b['1']);
        });

    //Выводи массив на просмотр 
    echo "<pre>";
    print_r($end);
    echo "</pre>";

Но проблема в том, что даже несмотря на то, что оформление кода одинаковое, часть новостей не парсится, т.е. некоторых новостей достается текст статьи, а некоторые статьи приходят пустыми, хотя в них текст есть. Как такую проблему можно решить?

P.S. Если вы читаете после 00:00 и решили проверить код, то замените в 45 строчке Сегодня на Вчера

Answer 1

Полным перебором библиотек и регулярок, поэтапным экспериментам, я нашел проблему. Дело в том, что не в каждой статье есть указание источника, а у меня происходило его стирание, а т.к. его нет, то стирался весь текст:

$text = strstr($text, 'Источник', true);

И если добавить проверку на его наличие, то все работает:

$pos = strpos($text, 'Источник:');
 if($pos === true){
   $text = strstr($text, 'Источник', true);
 }

Оставлю это, может кому-то пригодится.

P.S. Зато был придумал за это время более удобный и короткий способ парсинга, иногда полезно иметь ошибки.

READ ALSO
Как правильно вывести из XML данные

Как правильно вывести из XML данные

Offer - это товарУ одного товара есть индефикатор <vendorCode> НО! Этот вендор разделен, то есть у него есть еще offer с другими размерами

305
Кодировка темы письма с кириллицей

Кодировка темы письма с кириллицей

Всем доброго времени суток!

398
solr php ERROR adding field

solr php ERROR adding field

через php пытаюсь наполнить солр, но иногда получаю такие ошибки: ERROR adding field pzn='**' rgn='1481/16' скрин прилагаю:

261
Вирус майнинга закрался на сервер

Вирус майнинга закрался на сервер

В файлах php появился посторонний код и в папки mod-tmo создаются файлы php*************** которые загружат cpu на до 100%

253