1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #!/usr/bin/perl -w
use strict;
use diagnostics;
use LWP::Simple; # on a dit qu'on commençait simple
use HTML::Parser; # mais ça se complique ;-)
use HTML::Form;
# récupère la page web correspondant au critère de recherche
my $content = get( "http://www.apt-get.org/search.php?query=" . shift);
# crée un nouvel analyseur
my $p = HTML::Parser->new();
# éléments de l'automate
my $status = ''; # l'état courant de l'automate
my $this; # le dépôt en cours d'analyse
my %data = (); # la structure de données complète
# définit les gestionnaires d'événements
$p->handler( text => \&text, "text" );
$p->handler( start => \&start, "tagname,attr" );
$p->handler( end => \&end, "tagname" );
$p->unbroken_text( 1 );
sub start {
my ( $tag, $args ) = @_;
if ( $tag eq 'li' ) {
# début d'un nouveau dépôt
if ( $args->{class} eq 'verifiedsite' ) {
$this = {}; # nouvelle structure vide
$status = 'NEW';
}
# début d'une liste de paquetages
elsif ( $args->{class} eq 'packagelist' ) {
$this->{pkg} = [];
$status = 'PKG';
}
}
# les entrées du sources.list
elsif ( $tag eq 'span' ) {
if ( $args->{class} eq 'url' ) {
$status = 'URL';
push @{ $this->{deb} }, "";
}
}
# ici, on ajoute l'entrée en cours de création
# dans la structure $data, avec la clé entryXXX
elsif ( $tag eq 'a' ) {
if ( $status eq 'NEW' ) {
$data{ $args->{name} } = $this if( $args->{name} );
}
}
# séparateurs texte du formulaire
elsif ( $tag eq 'br/' ) {
if ( $status eq 'URL' ) {
push @{ $this->{deb} }, "";
}
elsif ( $status eq 'PKG' ) {
push @{ $this->{pkg} }, "";
}
}
}
sub end {
my $tag = shift;
# fin des urls
$status = 'NEW' if $tag eq 'span' and $status eq 'URL';
# fin de la liste de paquetages
$status = 'NEW' if $tag eq 'li' and $status eq 'PKG';
}
sub text {
my $text = shift;
# supprime les sauts lignes
$text =~ y/\012\015//d;
# texte du sources.list
$this->{deb}[-1] .= $text if $status eq 'URL';
# liste des paquetages (ignore la première ligne)
if ( $status eq 'PKG' ) {
$this->{pkg}[-1] = $text unless $text eq 'Matches:';
}
}
for ( keys %data ) {
print "# $_\n" for grep { $_ } @{ $data{$_}{pkg} };
print "$_\n" for grep { $_ } @{ $data{$_}{deb} };
print "\n";
}
# analyse le document
$p->parse($content);
$p->eof; |
Partager