Newsgroup: it.comp.lang.perl
Titolo: Cercare in un file HTML

Salve a tutti,
mi trovo di fronte ad una situazione a cui non so far fronte:
ho un file HTML scaricato da un sito; in questo file HTML c'ï¿œ un tag con
uno o piï¿œ attributi (mettiamo <a class= ... href= ...>) che contiene una
o piï¿œ parole (in questo caso un URL).
Io ho bisogno di estrarre quella o quelle parole.
Come posso fare? Ho provato ad utilizzare il modulo HTML::Parser e
HTML::TreeBuilder, ma senza successo (sicuramente dovuto alla mia
incompetenza: sono davvero alle prime armi con il Perl).
Un grande grazie a chi potrï¿œ o vorrï¿œ aiutarmi :)
- Deus Ex

 Un grande grazie a chi potrï¿œ o vorrï¿œ aiutarmi :)
Se posti un frammento significativo del tuo HTML, ci dici come vanno 
identificati gli elementi che ti interessano e ci descrivi con esattezza 
cosa vuoi estrarre da essi, non ci dovrebbero essere problemi a fornirti 
del codice d'esempio.

Grazie della disponibilitï¿œ!
Il codice HTML che mi interessa parsare ï¿œ di questa pagina:
http://www.joomla.it/download.html
Vorrei trovare il modo di isolare il link per il download dell'ultima
versione disponibile del software, per poi poterlo scaricare.
Grazie ancora!
- Deus Ex
Emanuele Zeppieri ha scritto:


 versione disponibile del software, per poi poterlo scaricare.
Assumo che il link all'ultima versione sia il link (ai download di 
Joomla) che compare per primo nella pagina.
Se vuoi un criterio piï¿œ /robusto/, devi fornirmelo tu (basta una 
descrizione informale, non bisogna conoscere Perl).
Comunque per adesso funziona perfettamente.
Lo script provvede pure a modificare il link estratto dalla pagina 
(perchï¿œ si tratta del link ad un'altra pagina) per ottenere il link 
diretto per il download.
Per eseguire lo script, salva il codice nel file 
joom.pl
, e poi da una 
shell:
perl 
joom.pl
Otterrai in output il link (diretto) all'ultima versione di Joomla; 
quindi, se vuoi proprio scaricare il file, basta (da bash):
wget -O joomla.zip $(perl 
linkextor.pl
)
Assicurati di avere installati tutti i moduli utilizzati (nelle use).
(HTML::LinkExtor fa parte della distribuzione HTML::Parser, quindi se 
hai giï¿œ installato quest'ultima sei OK).
P.S.
Avessi saputo che era per Joomla, non mi sarei offerto ;-)
Ciao!
---
#!/usr/bin/perl
use strict;
use warnings;
use HTML::LinkExtor;
use LWP::UserAgent;
use URI::URL;
use List::Util 'first';
my $ua = LWP::UserAgent->new;
my $p = HTML::LinkExtor->new( undef, '
http://www.joomla.it/
' );
my $res = $ua->request(
     HTTP::Request->new( GET => '
http://www.joomla.it/download.html
' ),
     sub { $p->parse( $_[0] ) }
);
( my $download_link = first {
     /download\/\d+-joomla[\d\-]+ita-stable\.html$/
} map $_->[2], $p->links ) =~ s/\.html$/\/download.html/;
print $download_link, "\n";

 wget -O joomla.zip $(perl 
linkextor.pl
)
wget -O joomla.zip $(perl 
joom.pl
)

 );
si puï¿œ abbreviare, eseguendolo in void context:
$ua->request(
     HTTP::Request->new( GET => '
http://www.joomla.it/download.html
' ),
     sub { $p->parse( $_[0] ) }
);
(nel funzionamento dello script non cambia niente).

 diretto per il download.
Mi sono accorto soltanto adesso che nella pagina c'ï¿œ giï¿œ il link diretto 
al download, quindi si puï¿œ estrarre direttamente quello (senza stare a 
modificare il link che lo precede), rendendo lo script ancora piï¿œ compatto:
---
#!/usr/bin/perl
use strict;
use warnings;
use HTML::LinkExtor;
use LWP::UserAgent;
use URI::URL;
use List::Util 'first';
my $ua = LWP::UserAgent->new;
my $p = HTML::LinkExtor->new( undef, '
http://www.joomla.it/
' );
$ua->request(
     HTTP::Request->new( GET => '
http://www.joomla.it/download.html
' ),
     sub { $p->parse( $_[0] ) }
);
my $download_link = first {
     /download\/\d+-joomla[\d\-]+ita-stable\/download\.html$/
} map $_->[2], $p->links;
print $download_link, "\n";

Diamine! CPAN ï¿œ davvero zeppo di soluzioni giï¿œ pronte :)
E pensare che io alla fine avevo trovato un modo un po' bulgaro di operare:
use HTML::TagParser;
my $html = HTML::TagParser->new( "
http://www.joomla.it/download.html
" );
my @list = $html->getElementsByTagName( "a" );
foreach my $elem ( @list ) {
        my $tagname = $elem->tagName;
        my $attr = $elem->attributes;
        my $text = $elem->innerText;
        my $appoggio = "<$tagname";
        my $mezzo;
        my $fine =  ">$text</$tagname>";
        foreach my $key ( sort keys %$attr ) {
                $mezzo .= " $key=\"$attr->{$key}\"";
        }
        my $stringa_da_cercare = "$appoggio" . "$mezzo" . "$fine";
        if ($stringa_da_cercare =~m/ita-Stable.tgz/i) {
                                $real_url = $stringa_da_cercare;
                                last;
                        }
}
system("wget -nc -q $real_url -O joomla-latest.tgz -P/tmp");
Grazie mille comunque dell'esempio e dell'aiuto! :)
Ora ho un po' di moduli da studiare e imparare!
Ciao!
- Deus Ex
Emanuele Zeppieri ha scritto:
