HTML :: TokeParser находит теги _until_ определенный тег - PullRequest
0 голосов
/ 28 июня 2011

Мне нужно прочитать html-файл и найти определенный тег абзаца с определенным текстом в нем.Как только я найду этот тег, я хочу получить текст от всех следующих тегов до Я нахожу табличный тег

Пример:

<asdf>
</asdf>
<p>THE SIGNAL TO GET INFO</p>
    <something>some good stuff in here</something>
<p>something else</p>
<ul>
    <li>something good in here for sure</li>
    <li>this too</li>
</ul>
<table> I DON'T WANT THIS </table>

Я могу найти первыйТег абзаца с HTML :: TokeParser выглядит следующим образом:

my $description = "";
my $tp = HTML::TokeParser->new(\$content) || die "Can't open: $!";

while (my $token = $tp->get_tag("p")) {
    my $paragraph = $tp->get_trimmed_text("/p");
    if ($paragraph =~ /On this page/) {
        until ((my $stop = $tp->get_token)->[1] eq "table") {
            if ( $stop->[0] eq "S" ) {
                print $stop->[0],"\n";
            }
        }
        return $description;
    } 
}

Я пробовал приведенный выше код ... но с ним что-то отчаянно не так, поскольку он даже не скомпилируется.* Спасибо за вашу помощь.

1 Ответ

1 голос
/ 28 июня 2011

Вы, вероятно, хотите вызвать $ tp-> get_token, сохраняя данные до тех пор, пока не увидите ["S", "table"…]

Вы говорите, что не могли заставить это работать. Можете ли вы объяснить, почему / что вы видели? Возможно, приведите полный пример для людей, с которыми можно играть.

Ну, вы не предоставили пример вывода, поэтому я сделал несколько предположений.

#!/usr/bin/perl
use HTML::TokeParser;

my $content = "<asdf>
</asdf>
<p>THE SIGNAL TO GET INFO</p>
    <something>some good stuff in here</something>
<p>something else</p>
<ul>
    <li>something good in here for sure</li>
    <li>this too</li>
</ul>
<table> I DON'T WANT THIS </table>
";

my $description = "";
my $tp = HTML::TokeParser->new(\$content) || die "Can't open: $!";

while (my $token = $tp->get_tag("p")) {
    my $paragraph = $tp->get_trimmed_text("/p");
    if ($paragraph =~ /THE SIGNAL TO GET INFO/) {
      while (my $toke = $tp->get_token)
      {
        last if ($toke->[1] eq "table");
#       print "<$toke->[0]> <$toke->[1]> <$toke->[2]> <$toke->[3]> <$toke->[4]>\n";
#       print " <".join("><",@{$toke->[3]}).">\n";
        if ($toke->[0] eq "T" ) {
                my $text = $toke->[1];
                $description .= $text;
        }
      }
      print $description;
      last;
    }
}

Производит:

    some good stuff in here
something else

    something good in here for sure
    this too
...