[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите в создании парсера
ak167
Всем привет.

Делаю парсер но никак не получается. А задание такое:

Имеется код:
<div class="entry">


<div class="preview">
<a href="http://site.ru/index.php" rel="nofollow" target="_blank"><img alt="63338" border="0" src="/images/thumbs/1.jpg?1290252672" /></a>
</div>
<a href="http://site.ru/index.php" class="title" rel="nofollow" target="_blank">Название</a>
<div class="spam_warning" id="entry_63338_notice">
</div>
<div class="info">
<i>site.ru</i> — Описание
</div>



<div class="preview">
<a href="http://site2.ru/index.php" rel="nofollow" target="_blank"><img alt="63338" border="0" src="/images/thumbs/2.jpg?1290252672" /></a>
</div>
<a href="http://site2.ru/index.php" class="title" rel="nofollow" target="_blank">Название2</a>
<div class="spam_warning" id="entry_63338_notice">
</div>
<div class="info">
<i>site.ru</i> — Описание2
</div>



<div class="preview">
<a href="http://site3.ru/index.php" rel="nofollow" target="_blank"><img alt="63338" border="0" src="/images/thumbs/3.jpg?1290252672" /></a>
</div>
<a href="http://site3.ru/index.php" class="title" rel="nofollow" target="_blank">Название3</a>
<div class="spam_warning" id="entry_63338_notice">
</div>
<div class="info">
<i>site.ru</i> — Описание3
</div>


</div>

Нужно извлечь из этого списка тем ссылки, названия и описания.

DySprozin, пытался вытянуть (отпарсить) описание между </i> и </div>, но не получилось! В массиве thumd пусто :(
Где тут моя ошибка?


$text = file_get_contents( 'http://site.ru/' );
preg_match( '/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/', $text , $thumb[] );
print_r( $thumb );




Спустя 10 минут, 13 секунд (20.11.2010 - 20:36) DySprozin написал(а):
ak167
ну и в чем проблема? регулярка-то простенькая (;

Спустя 5 минут, 55 секунд (20.11.2010 - 20:42) ak167 написал(а):
DySprozin, объясните мне пожалуйста что такое регулярка? Я просто парсеров никогда не делал.

Спустя 19 минут, 21 секунда (20.11.2010 - 21:01) DySprozin написал(а):
курим регулярку раз
курим регулярку двас

там настолько все понятно написано, что даже я понял (;

add
и да, не против, если на "ты"? По мне, выканье на форумах - как-то пластиково (не навязываю, но все-таки)

Спустя 2 часа, 51 минута, 6 секунд (20.11.2010 - 23:52) ak167 написал(а):
DySprozin, пытался вытянуть (отпарсить) описание между </i> и </div>, но не получилось! В массиве thumd пусто :(
Где тут моя ошибка?


$text = file_get_contents( 'http://site.ru/' );
preg_match( '/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/', $text , $thumb[] );
print_r( $thumb );

Спустя 11 минут, 28 секунд (21.11.2010 - 00:04) DySprozin написал(а):
хм... давай разбирать твой шаблон:

/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/

^ - начало строки - это еще почему? разве хоть какая-то строка начинается с "i>"? убрать "^"!
i> - i и угловая скобка - логично...
{2} - ты говоришь: "угловая скобка должна быть два раза подряд"
дальше смотреть пока не буду, исправляй (; а то у тебя получилось:

"найди мне строку, начинающуюся на i>>" blink.gif

Спустя 1 час, 38 минут, 19 секунд (21.11.2010 - 01:42) SlavaFr написал(а):
 $pattern = '!href="([^"]+)" class="title"[^>]+>(.+)</a>.*<div class="info">.*>.*>(.+)</div>!sU';

$result = preg_match_all($pattern, $subject, $subpattern);
echo '<pre>'.print_r($subpattern, TRUE).'</pre>';

a по хорошим делам это делают при помощи DomDocument и XPath

Спустя 16 часов, 29 минут, 59 секунд (21.11.2010 - 18:12) ak167 написал(а):
Цитата
хм... давай разбирать твой шаблон:

/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/

^ - начало строки - это еще почему? разве хоть какая-то строка начинается с "i>"? убрать "^"!
i> - i и угловая скобка - логично...
{2} - ты говоришь: "угловая скобка должна быть два раза подряд"
дальше смотреть пока не буду, исправляй (; а то у тебя получилось:

"найди мне строку, начинающуюся на i>>"

DySprozin, действительно)))

Исправил вот так:
preg_match( '/^i{1}>{1}[-,a-zA-Zа-яА-Я0-9]div>+$/', $text , $thumb );
всеравно не работает! Теперь то что не так?

Цитата
$pattern = '!href="([^"]+)" class="title"[^>]+>(.+)</a>.*<div class="info">.*>.*>(.+)</div>!sU';

  $result = preg_match_all($pattern, $subject, $subpattern);
  echo '<pre>'.print_r($subpattern, TRUE).'</pre>';


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

Спустя 1 час, 17 минут, 23 секунды (21.11.2010 - 19:29) DySprozin написал(а):
хм... как тебе объяснить)) шило на мыло (;

^i - означает: строка начинается на i, ну где у тебя такая строка? tongue.gif

В принципе, могу накидать тебе шаблон, но ИМХО тебе полезней самому разобраться (;

Спустя 4 минуты, 45 секунд (21.11.2010 - 19:34) ak167 написал(а):
DySprozin, вот:

<i>site.ru</i> — Описание3
</div>

Я пытаюсь вырвать кусок с "i> - описание</div>". В идеале конечно нужно вырвать само описание, но я не знаю как. Поэтому вырываю этот кусок а затем с помощью str_replace удалю ненужные символы, чтобы осталось одно описание.

Спустя 8 минут, 3 секунды (21.11.2010 - 19:42) DySprozin написал(а):
;;DySprozin, вот:
ну и?)) строка-то у тебя начинается с <i>, так что либо
^<i>
либо совсем убрать "^" (;

шаблон для
<i>site.ru</i> — Описание3
</div>


вот:
/<\/i>[^<]+<\/div>/isU


дальше давай сам (;

Спустя 14 минут, 59 секунд (21.11.2010 - 19:57) DySprozin написал(а):
ах да, забыл, надо брать в скобки:

вариант1
/<\/i>([^<]+)<\/div>/isU

вариант2
#</i>([^<]+)</div>#isU

вариант3
#</i>([^<]+)$#isU

Спустя 1 час, 3 минуты, 22 секунды (21.11.2010 - 21:00) ak167 написал(а):
DySprozin, попробывал. Работает но с глюками. Вместо словосочетания "и тут наши "Катюши"... *@/!!!" выдает вот что:
user posted image
Кодировка стоит windows-1251.
Из-за чего вылезает абракадабра вместо слов?

Кстати, он нашел вроде как описание одной темы, а мне нужно чтобы скрипт находил описание всех десяти тем! Как это осуществить?

Спустя 14 минут, 19 секунд (21.11.2010 - 21:15) DySprozin написал(а):
;;Как это осуществить?
preg_match_all юзай (;

;;Работает но с глюками.
а вот так?
#</i>([^<]+)$#isUu

Спустя 48 минут, 56 секунд (21.11.2010 - 22:04) ak167 написал(а):
DySprozin, так вообще не работает sad.gif

Спустя 6 часов, 33 минуты, 16 секунд (22.11.2010 - 04:37) DySprozin написал(а):
;;Из-за чего вылезает абракадабра вместо слов?
с другими кодировками играться не пробовал? попробуй вывод не на экран, а в другой файл (;

Спустя 5 часов, 41 минута, 9 секунд (22.11.2010 - 10:18) vergin написал(а):
попробуй это:

$pattern = "/<i>.+<\/div>/";

Спустя 2 дня, 9 часов, 47 минут, 6 секунд (24.11.2010 - 20:05) ak167 написал(а):
DySprozin, хотя нет, все работает! Нужно было лишь кодировку на сайте сменить! smile.gif

Я даже попытался получить еще и название из этого html-кода. Но получилось вот что:
названиеtarget="_blank"

Использовал вот такую решулярку: #target="_blank">([^<]+)</a>#isU

А вот получить ссылку так и не получилось. Не подскажите как мне это сделать и как получить название без arget="_blank"?

Спустя 1 час, 42 минуты, 2 секунды (24.11.2010 - 21:47) DySprozin написал(а):
;;Но получилось вот что
preg_match или preg_match_all использовали? (;

;;А вот получить ссылку так и не получилось.
что делали/какой результат? (;

Спустя 23 часа, 26 минут, 49 секунд (25.11.2010 - 21:14) ak167 написал(а):
DySprozin, все названия получал во так:
preg_match_all( '#target="_blank">([^<]+)</a>#isU', $text , $title );

потом приходилось чистить их вот так:

for ($i=0; $i<=9; $i++)
{
$tit = str_replace( 'target="_blank">', '', $title[0][$i] );
echo $tit;

}


А вот ссылки получить так и не удалось. Для их получения использовал вот такой код:
preg_match_all( '#href"([^href"]+)"#isU><img alt="#isU', $text , $link );

Спустя 2 часа, 37 минут, 17 секунд (25.11.2010 - 23:51) DySprozin написал(а):
;;потом приходилось чистить их вот так:
потому что надо курить мануалы :P

правильно так:

for ($i=0; $i<=count($title[1]); $i++){
echo $title[1][$i];
}

т.е. echo $title[1][$i];

;;preg_match_all( '#href"([^href"]+)"#isU><img alt="#isU', $text , $link );

[^href"] означает: "без _символов_ h, r... итд" тебе оно надо? (; и "равно" после href пропустил (; ну, для первого раза очень даже неплохо, есть куда расти (; в данном же случае все просто до нельзя:

preg_match_all( '#href="([^"]+)"#isU', $text , $title );
for ($i=0; $i<count($title[1]); $i++)
{
echo $title[1][$i]."<br>";
}


если что непонятно - спрашивай (;

Спустя 20 часов, 10 минут, 34 секунды (26.11.2010 - 20:02) ak167 написал(а):
DySprozin, мануал я курил! smile.gif Но там не все описано.

Например, из вашей регулярки после прочтения мануала мне не все ясно.
Вот например нормально работающщая регулярка опписания:
#</i>([^<]+)</div>#isU
ну знак # в начале и в концые это понятно. Далее </i> это то, по чему осуществляется поиск, тоже ясно.
Далее ([^<], как вы описали выше, значает без символов. В данном случаем без символа "<". Непонятно зачем и главное какое это имеет отношение к этому случаю?
Далее идет плюс и закрывается скобочка. Плюс это как я понимаю плюс еще какие-то сиволы, однако они не указаны в [a-z,0-9]. Почему?
Далее идет </div> и #isU. С этим тоже все понятно.

Буду благодярен, если ответите на мои вопросы.

Спустя 36 минут, 17 секунд (26.11.2010 - 20:38) DySprozin написал(а):
ak167
>Далее ([^<], как вы описали выше, значает без символов.
не-а tongue.gif это означает: "любой символ, кроме этого"

>Далее идет плюс и закрывается скобочка.
плюс означает >=1 символа. Т.е. имеем:
</i>([^<]+)</div>
означает: "найти и сохранить (сохранение обеспечивают скобки) группу символов между </i> и </div>, причем символы любые, кроме угловой скобки" (;

>какое это имеет отношение к этому случаю?
очень просто: описание по определению не может содержать угловых скобок (для этого есть &lt; &gt;), потому можно этим воспользоваться (;

Спустя 1 день, 1 час, 25 минут, 20 секунд (27.11.2010 - 22:04) ak167 написал(а):
DySprozin, теперь ясны эти моменты.
Подредактировал с учетом вышеизложенного. Теперь ссылки находяться, однако, всего для 3-х тем вместо 10! Т.е. находятся не все. В чем причина?
И еще вместо чистой ссылки она опять с ненужными примесями!
Нужно так: http://yandex.ru
А она вот так: href="http://yandex.ru"rel="nofollow"target="_blank">

Использую вот эту регулярку:
#href="([^<]+)"><img alt="#isU

Вроде как делаю все правильно по аналогии с той регуляркой, которую ты мне давал ранее для описания (#</i>([^<]+)</div>#isU), однако, описание получаеться чистое без примесей, а ссылка с лишними примесями, которые я испольовал в регулярке, т.е. с href=" и "rel="nofollow"target="_blank">. Почему так?
Особенно удивляет почему из десяти тем парсер извлекает ссылки только из трех.

Спустя 3 минуты, 31 секунда (27.11.2010 - 22:07) DySprozin написал(а):
;;всего для 3-х тем вместо 10!
ээ... где 10? (;

Спустя 14 часов, 55 минут, 29 секунд (28.11.2010 - 13:03) ak167 написал(а):
DySprozin, в самом первом сообщении этой темы я привел код для 3-х сообщений. На самом деле их 10 и все надо отпарсить=)

Спустя 55 минут, 9 секунд (28.11.2010 - 13:58) DySprozin написал(а):
ak167
Цитата
Использую вот эту регулярку:
#href="([^<]+)"><img alt="#isU

ну потому что ты не хочешь вникнуть :(
последняя подсказка: надо
#href="([^"]+)"><img alt="#isU

тогда мусора не будет (;

;;мануал я курил!
ну а ты думаешь, что я узнал от тайного общества программистов?))) в мануалах все есть, просто читать их надо вдумчиво, перед сном, а можно вместо сна :D

кидай в личку свой текст, будет время - напишу для него шаблон...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.