Делаю задание по парсингу данных со специального сайта с крайне непонятным движком внутри. Новость выводится в своем теге(он всегда одинаков), я делаю это этим кодом:
<?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 строчке Сегодня
на Вчера
Полным перебором библиотек и регулярок, поэтапным экспериментам, я нашел проблему. Дело в том, что не в каждой статье есть указание источника, а у меня происходило его стирание, а т.к. его нет, то стирался весь текст:
$text = strstr($text, 'Источник', true);
И если добавить проверку на его наличие, то все работает:
$pos = strpos($text, 'Источник:');
if($pos === true){
$text = strstr($text, 'Источник', true);
}
Оставлю это, может кому-то пригодится.
P.S. Зато был придумал за это время более удобный и короткий способ парсинга, иногда полезно иметь ошибки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Offer - это товарУ одного товара есть индефикатор <vendorCode> НО! Этот вендор разделен, то есть у него есть еще offer с другими размерами
через php пытаюсь наполнить солр, но иногда получаю такие ошибки: ERROR adding field pzn='**' rgn='1481/16' скрин прилагаю:
В файлах php появился посторонний код и в папки mod-tmo создаются файлы php*************** которые загружат cpu на до 100%