Voglio analizzare un sito Web in una struttura dati Perl. primo passo per caricare la pagina conCome analizzare tra <div class ="foo"> and</div> facilmente in Perl
use LWP::Simple;
my $html = get("http://f.oo");
Ora so due modi per affrontare con esso. Prima sono le espressioni regolari e il secondo i moduli.
Ho iniziato a leggere su HTML::Parser e ho trovato alcuni esempi. Ma non sono sicuro della conoscenza di Perl.
Il mio esempio di codice va avanti
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");
}
non capisco il motivo per cui ci sono due volte un turno. Il secondo dovrebbe essere l'auto puntatore. Ma il primo mi fa pensare che l'auto riferimento sia già spostato, usato come un hash e il valore per href è memorizzato in $class
. Qualcuno potrebbe spiegare questa riga (my ($class) = shift->{href};
)?
Accanto a questa mancanza, non voglio per analizzare tutti gli URL, voglio mettere tutto il codice tra <div class ="foo">
e </div>
in una stringa, dove un sacco di codice è tra, specialmente altri <div></div>
tag. Quindi io o un modulo dobbiamo trovare l'estremità giusta. Dopo di che ho programmato di eseguire la scansione di nuovo la stringa, per trovare classi speciali, come <h1>,<h2>, <p class ="foo2"></p>
, ecc
Spero che queste informazioni ti aiuta a darmi alcuni consigli utili, e vi prego di avere in mente che prima di tutto voglio un modo semplice di comprensione, che non deve essere una grande prestazione nel primo livello!
DON 'USARE ESPRESSIONI REGOLARI! HTML NON È REGOLARE! –
Come rinfrescante vedere qualcuno che usa un parser HTML per analizzare HTML invece di espressioni regolari: p +1 solo per quello – fge
FWIW: 'my ($ class) = shift -> {href};' <- significa prendere il 'href' membro dell'hash dell'argomento spostato. Potrebbe essere stato scritto 'my $ ref = shift; my $ class = $ ref -> {"href"}; ' – fge