Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Граббер: извлечь заголовок, первое предложение аннонса и дату
 
 автор: Лена   (16.07.2008 в 15:02)   письмо автору
 
 

Из куска текста, который вытягивается из исходника, нужно выцепить заголовок, первое предложение аннонса и дату. Код вот такой получился:

<?php
$text 
file_get_contents ("http://www.budshop.com.ua/content/blogcategory/62/153/");

// Ищем начало вхождения фрагмента
$text trim ($text); 
$s strpos($text'<table class="contentpaneopen">'0); 
$text substr($text$s);
// Ищем конец фрагмента
$s strpos($text'</td></tr></table></td></tr><tr>'); 
$text substr($text0$s); 

//вырезать из текста то, что нужно
$header preg_match_all('#<td class="contentheading" width="100%"><a href=([^>]*+)>[^<]*</a></td>#i',$text$header1PREG_PATTERN_ORDER);
 
$annons preg_match_all('#<div class="article-content clearfix">[^<]*</nobr></div>#is'$text$annons1PREG_PATTERN_ORDER);

foreach(
$annons1[0] as $a){
$a2 explode("."$a);
$annons_a $a2[0];
}
$date preg_match_all('#<td [^>]* class="createdate">[^<]*</td>#i',$text$date1PREG_PATTERN_ORDER);

for (
$i 0$i count($header[0])&&$i count($annons_a)&&$i count($date[0]); $i++){

print 
$header1[0][$i]."<br>".$annons_a[$i]."<br>".$date1[0][$i];
}
?>


Кусок текста нормально вытягивается, а вот что дальше с ним происходит, когда все вырезается, - на экран абсолютно ничего не выводится. Где я неправильно делаю?

   
 
 автор: sim5   (16.07.2008 в 19:23)   письмо автору
 
   для: Лена   (16.07.2008 в 15:02)
 

Вам нужно взять каждую новость, причем ссылка на исходник должна остаться? Ну зачем же тогда гонять рег. выражения? Ну вроде есть простые и готовые функции в РНР, которыми можно все это сделать:

<?
$text 
file_get_contents ("http://www.budshop.com.ua/content/blogcategory/62/153/");
//это начало
$text substr($textstrpos($text'<table class="contentpaneopen">'));
//это уже кусок, хотя по этой строке может и не повезти
$text substr($text0strpos($text'</td></tr></table></td></tr><tr>'));
//выбросили все теги, кроме линков
$text strip_tags($text"<a></a>");
//убрали повторы
$text str_replace("Новости недвижимости","",$text);
//получили массив новостей
$text explode("Подробнее..."$text);
for (
$i=0$i<count($text); $i++) {
  echo 
"<p>$text[$i]</p>";
}
?>

А если у них есть RSS, то может ее лучше брать для "раскроя"?

   
 
 автор: Лена   (17.07.2008 в 10:39)   письмо автору
 
   для: sim5   (16.07.2008 в 19:23)
 

RSS-канала у них нет.
Вопросы:
1. Как сделать так, чтобы ссылки вели не на страницу исходника, а на мою страницу?
2. Как сделать, чтобы новости обновлялись, скажем так, каждые 2 часа автоматически?

   
 
 автор: sim5   (17.07.2008 в 11:18)   письмо автору
 
   для: Лена   (17.07.2008 в 10:39)
 

1. Если взять анонсы с другого сайта, а направление с них на себя, то это мини-плагиат получается.) Зачем же тогда брать их на другом сайте?
Каждый эелемент массива $text в примере, содержит первое предложение как ссылку. Можно забрать текст этой ссылки (кстати без всяких рег. выр.) и то, что идет после ссылки. Для первого и второго удаляем теги А (так как текст содержит еще ссылки), превратив первое полученное в заголовок, второе в анонс, добавив в конце его <a href="main.php">Подробнее...</a> (собственно зачем тогда их вообще сохранять эти ссылки - вырезать сразу).
2. Использовать планировщик Cron.

   
 
 автор: BinLaden   (17.07.2008 в 11:20)   письмо автору
 
   для: sim5   (17.07.2008 в 11:18)
 

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

   
 
 автор: sim5   (17.07.2008 в 11:22)   письмо автору
 
   для: BinLaden   (17.07.2008 в 11:20)
 

Можно, но обновление будет только при входе на страницу - не будет посетителей, не будет и обновления. Если нет лимита на 2 часа, тогда конечно так.

   
 
 автор: BinLaden   (17.07.2008 в 11:23)   письмо автору
 
   для: sim5   (17.07.2008 в 11:22)
 

Да, но я вижу в этом только плюс. Кому нужно обновление, если нет посетителей?

   
 
 автор: sim5   (17.07.2008 в 11:28)   письмо автору
 
   для: BinLaden   (17.07.2008 в 11:23)
 

Я такого же мнения, но если срашивают как через 2 часа, то что надо ответить? А вдруг это несколько для иного (перенаправляем то на себя, а на что?):) Если аргумент, что это не совсем обязательно (так же как и для курса валют вопрос был недавно), то автор, думаю, согласится, что без планировщика тоже достаточно будет.)

   
 
 автор: Лена   (17.07.2008 в 13:27)   письмо автору
 
   для: sim5   (17.07.2008 в 11:28)
 

Как можно записать время последнего обновления без планировщика Cron? Если все новости я нигде сохранять не буду, мне нет в этом надобности, т.е. таблицы у меня не будет.

   
 
 автор: sim5   (17.07.2008 в 13:46)   письмо автору
 
   для: Лена   (17.07.2008 в 13:27)
 

Использовать одно из двух:
1. Запись в файл.
2. Запись в базу.
1 - можно конечно, но лучше обойтись без этого.
2 - наверняка потребуется некая служебная таблица, в которой вполне может быть всего одна строка записи: курс валют, состояние неких счетчиков и т.п. Вот в такую таблицу и можно записать последню дату обращения к этой странице.

PS. Кстати, если не сохранять анонсы, то как увидит их следующий пользователь, для которого установлено, что обращаятся еще рано, а обращения не было?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования