[room] Perl & parsers & вложенные одинаковые теги

Di denyago на rambler.ru
Сб Янв 23 23:28:38 UTC 2010


Доброго времени суток!

Пробую из страницы вот такого типа: <div class=view_text><div 
class=no_need>NOT NEEDED</div>NEED THIS</div> вытащить текст. Должно 
получится NOT NEEDEDNEED THIS . В любом случае получается NOT NEEDED

Где я не прав?

Искал "perl parse nested tags", но ничего полезного не нашел...

Скрипт 1:
---------------------------------------------------------------------
#!/usr/bin/perl -w
   use HTML::Parser ();
   sub start_handler
   {
	my $tagname = shift; my $self = shift; my $att = shift;
	if ($att->{'class'}){
		if ($tagname eq "div" && $att->{'class'} eq "view_text") {
			$self->handler(text => sub { print shift }, "dtext");
			$self->handler(end  => \&stop_handler,"tagname,self,attr");
		}
	}
   }
   sub stop_handler
   {
	my $tagname = shift;
	my $self = shift;
	my $att = shift;
	if ($tagname eq "div"){
		$self->eof;
	}
   }
   my $p = HTML::Parser->new();
   $p->handler( start => \&start_handler, "tagname,self,attr");
   $p->parse_file(shift || die) || die $!;
   print "\n";
---------------------------------------------------------------------
Скрипт 2:
---------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use HTML::TokeParser;
my $p = HTML::TokeParser -> new(shift || die) || die $!;
while (my $token = $p -> get_tag('div')) {
     my $class = $token -> [1]{class} || '';
     if ($class eq 'view_text') {
     	my $text = $p -> get_trimmed_text("/div");
     	print $text;
     }
}
print "\n";
---------------------------------------------------------------------
Скрипт 3 (тут вроде что-то как надо (->dump), сам текст не выводится)
---------------------------------------------------------------------
#!/usr/bin/perl -w
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new; # empty tree
my $test = HTML::TreeBuilder->new; # empty tree
     $tree->parse_file(shift || die);
	$test = $tree;
	$test = $test->find_by_attribute('class','view_text');
	$test->dump;
	$test->as_HTML;
	$test->as_text;
	$test->as_XML;
       $tree->dump;
       $tree->as_HTML;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : denyago.vcf
Тип     : text/x-vcard
Размер  : 366 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/smoke-room/attachments/20100124/4fa4444f/attachment.vcf>


Подробная информация о списке рассылки smoke-room