Forum Webscript.Ru

Программирование => Perl => Тема начата: AnnA от 28 Сентября 2004, 13:32:47

Название: HTML parse
Отправлено: AnnA от 28 Сентября 2004, 13:32:47
извинте, что я к вам обращаюсь... :)
привет!
Что-то никак у меня не получается из html-файла достать нужное... :( Помогите, подскажите, пожалуйста.
Есть такой файл:

мета тэги
несколько абзацев

(хотя их может и не быть)

Бабушка, расскажи сказку!
В некотором царстве, некотором государстве была огромная гора.
И посреди той горы зияла огромная нора. А в норе той была большая хрустальная комната
 с большой хрустальной кроватью посередине.
 И спала на той кровати заколдованным сном прекрасная принцесса.
 И, чтобы расколдовать ее, должен был придти прекрасный принц и поцеловать ее...
 Бабушка умолкает.
 - Ба, ну и как, расколдовали ее?
 - Какой там, внученька! Они хоть и прынцы но все равно - козлы!
 Прожила до семидесяти, шестерых родила - да так и не проснулась!..


еще несколько или один



Мне нужно достать все от Б и до

.
делаю так:
читаю файл в массив @indata,
for (@indata) {  $content = ($_=~ /(.*<\\/p>)/);   }
print \'
$content = \',$content;
получаю:
$content =
Название: HTML parse
Отправлено: AnnA от 28 Сентября 2004, 13:39:59
блин. а что - нельзя своё сообщение отредактировать теперь? Вон оно какое длиннющее получилось. :(
и почему-то съелся экран для слэща в регекспе. :(
$content = ($_=~ /(.*<\\/p>)/);
Название: HTML parse
Отправлено: Green Kakadu от 28 Сентября 2004, 14:16:59
AnnA поставь ключ s

$content = ($_=~ /(.*<\\/p> )/s);

тогда под символом \'.\' точка будет подразумеваься ЛЮБОЙ СИМВОЛ ВКЛЮЧАЯ СИМВОЛЫ НОВОЙ СТРОКИ
Название: HTML parse
Отправлено: AnnA от 28 Сентября 2004, 14:28:36
Green Kakadu не-а. пасиба за совет.
я пробовала и так, и так:
$content = ($_=~ /(.*<\\/p> )/s);
$content = ($_=~ /(.*<\\/p> )/sg);
не хочет. "каменный цветок"
Название: HTML parse
Отправлено: Green Kakadu от 28 Сентября 2004, 14:34:40
AnnA хочет:

/()/s

твоя ошибка:

 /(.*<\\/p>ПРОБЕЛ )/

Пробела там нет :) вот и не хотел.

P.S. чего-то форум показал так, будто и у меня пробел есть между <\\/p>и)   :) а его там быть не должно
Название: HTML parse
Отправлено: Green Kakadu от 28 Сентября 2004, 14:40:14
ключ g как я понимаю тебе не нужен - у тебя лишь одно включение данного блока будет?
Название: HTML parse
Отправлено: AnnA от 28 Сентября 2004, 16:24:16
Green Kakadu вот вашими бы устами да мёд пить. :)
$content = ($_=~/()/s);
не работает. :(
а пробела, да - его и не было в моём примере тоже. чего-то форум меня так подредактировал. :)

Цитировать
Green Kakadu:
у тебя лишь одно включение данного блока будет?

ага. совершенно одно. :)
спасибо за помощь. Я уже даже начала разбираться в HTML::Parser ради такого случая. охо-хо... Странно что не работает, правда? Или у вас всё получилось, пробовали?
Название: HTML parse
Отправлено: AnnA от 28 Сентября 2004, 17:07:10
в общем вот так получилось у меня вытянуть этот текст зловредный:use HTML::TokeParser;
  my $pt = HTML::TokeParser->new($p);
  while (my $token = $pt->get_tag("span")) {
       $content = $pt->get_trimmed_text("/p");

  }
здесь $p - путь к файлу. таких файлов у меня около 2 тыс и всякий раз файл выбираю через rand.
может есть более лёгкий способ выудить этот текст?
Название: HTML parse
Отправлено: Green Kakadu от 28 Сентября 2004, 17:22:52
Цитировать
Или у вас всё получилось, пробовали?

пробовал, у меня работает.
кодЖ
---------------------------------------------------------------------

#!/usr/bin/perl
my $text=qq~
мета тэги
несколько абзацев

(хотя их может и не быть)

Бабушка, расскажи сказку!
В некотором царстве, некотором государстве была огромная гора.
И посреди той горы зияла огромная нора. А в норе той была большая хрустальная комната
 с большой хрустальной кроватью посередине.
 И спала на той кровати заколдованным сном прекрасная принцесса.
 И, чтобы расколдовать ее, должен был придти прекрасный принц и поцеловать ее...
 Бабушка умолкает.
 - Ба, ну и как, расколдовали ее?
 - Какой там, внученька! Они хоть и прынцы но все равно - козлы!
 Прожила до семидесяти, шестерых родила - да так и не проснулась!..


еще несколько или один


~;
$text=~/()/s?print $1 : print \'нету ничего\';
Название: HTML parse
Отправлено: AnnA от 28 Сентября 2004, 17:36:00
у меня-тотекст в массиве. ну да сама виновата, наверное. не совсем точно задачу описала. а у меня это не работает. Вернее ваш пример - работает, а вот регексп для массива - увы. :)
только кодом, который я привела выше и получается достать нужный текст. сама удивляюсь. :) Пасиба вам ещё раз запомощь. ;)
Название: HTML parse
Отправлено: Green Kakadu от 28 Сентября 2004, 17:52:42
Цитировать
у меня-тотекст в массиве.

ээ.. построчно што ли? Тогда :) тогда о каких регекспах может идти речь, если проверяют лишь строку?
есть 2 варианта:
1 считывать все-таки в одну переменную
2 вот так:
----------------------------------------------------

join("\\n",@text)=~/()/s?print $1:print \'нет такого\';


3 если вы поподробнее опишете как это все выглядит (может в массиве много страниц?) то можно еще подумать.