Quiero analizar un sitio web en una estructura de datos Perl. En primer lugar me carga la página conCómo analizar entre <div class ="foo"> and</div> fácilmente en Perl
use LWP::Simple;
my $html = get("http://f.oo");
Ahora sé dos maneras de tratar con él. Primero están las expresiones regulares y los demás módulos.
Comencé leyendo sobre HTML::Parser y encontré algunos ejemplos. Pero no estoy tan seguro acerca del conocimiento de Perl.
Mi ejemplo de código va en
my @links;
my $p = HTML::Parser->new();
$p->handler(start => \&start_handler,"tagname,attr,self");
$p->parse($html);
foreach my $link(@links){
print "Linktext: ",$link->[1],"\tURL: ",$link->[0],"\n";
}
sub start_handler{
return if(shift ne 'a');
my ($class) = shift->{href};
my $self = shift;
my $text;
$self->handler(text => sub{$text = shift;},"dtext");
$self->handler(end => sub{push(@links,[$class,$text]) if(shift eq 'a')},"tagname");
}
No entiendo por qué hay dos veces por turno. El secound debe ser el auto puntero. Pero el primero me hace pensar que la auto-referencia ya está en shiftet, se usa como Hash y el valor para href se almacena en $class
. ¿Alguien podría explicar esta línea (my ($class) = shift->{href};
)?
Junto a esta falta, no quiero que analizar todas las direcciones URL, quiero poner todo el código entre <div class ="foo">
y </div>
en una cadena, donde las porciones de código es el medio, especialmente otros <div></div>
etiquetas. Entonces, yo o un módulo tenemos que encontrar el extremo correcto. Después de que lo planee para escanear la cadena de nuevo, para encontrar las clases especiales, como <h1>,<h2>, <p class ="foo2"></p>
, etc.
espero que esta información le ayuda a darme algunos consejos útiles, y por favor tenga en cuenta que en primer lugar me gustaría añadir una fácil comprensión, que no tiene que ser una gran actuación en el primer nivel!
DON 'T USE EXPRESIONES REGULARES! ¡HTML NO ES REGULAR! –
Qué reconfortante ver a alguien usando un analizador HTML para analizar HTML en lugar de expresiones regulares: p +1 solo para eso – fge
FWIW: 'my ($ class) = shift -> {href};' <- significa tomar el 'href' hash miembro del argumento desplazado. Podría haber sido escrito 'my $ ref = shift; my $ class = $ ref -> {"href"}; ' – fge