[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [HS] parser du html en shell



Le Wednesday 15 July 2009 00:44:38 Yves Rutschle, vous avez écrit :
> J'ai une question sur ce caractère:
>
> On Tue, Jul 14, 2009 at 09:58:28PM +0200, Yannick Fouquet wrote:
> > % cat blabla.html | \
> > perl -W -e 'while (<>){print "$2\n" if (/<a(.*?)>(.*)<\/a/oi);};'
>
>                                                             ^
>
> Il fait quoi ce 'o'? Je ne le trouve pas dans perlre(1).
>
> Merci d'avance,
> Y.

Le  manuel Perl est impressionnant quant à la qualité des documents en 
français. Ce n'est pas un programme sinon un langage ( langage pratique 
d'extraction et de rapport - Practical Extraction and Report Language ) ce 
qui demande de regarder les documents et exemples.

Pour comprendre le code ci-dessus, il faut regarder les documents:

 - perlre         Expressions régulières
 - perlvar       Variables prédéfinies en Perl
 - perlfaq       Foire Aux Questions
 - perlrun       Invocation de Perl et ses arguments
 - perldata    Types de données de Perl

Il y a aussi le programme 'perldoc' pour une documentation sur une fonction. 
Par exemple pour comprendre comment ouvrir un fichier uniquement en lecture:

% perldoc -f open

Saches que le code dans un script serait différent car il manque des éléments:

#!/usr/bin/perl -w

use strict;

unless ( defined(@ARGV) ) {
    print "Usage: $0 doc1.html doc2.html ...\n";
    exit(1);
}

while ( my $f = shift(@ARGV) ) {
    open(FH,"<" . $f) or die("open($f): $!\n");
    print $f . ":\n";
    while ( <FH> ) {
        chomp();
        if ( /<a(.*?)>(.*)<\/a/oi ) {
            print $1 . "\n";
        }
    }
    close(FH);
}
exit(0);

Enfin, pour améliorer le code d'une ligne, en utilisant l'option '-n' (boucle 
implicite autour de l'intégralité du code - plus besoin de while(<>){...}):

% perl -ne 'print "$1\n" if /<a(.*?)>(.*)<\/a/oi' html.html

Avec l'option '-i' ( édition sur place ) voila un 'sed' dopé à l'EPO en 
gardant une sauvegarde tout en modifiant le fichier 'monfichier' :
<http://articles.mongueurs.net/magazines/linuxmag50.html>

% perl -i.backup -pe 's/\bfoo\b/toto/g;s/\bbar\b/titi/g' monfichier
% ls
monfichier
monfichier.backup

Je ne suis absolument pas un expert, mais Perl est riche, puissant et souple  
pour ce que tu veux faire.

Personnellement, j'ai appris en lissant et relisant la documentation Perl, 
alors j'insiste pour que tu t'y plonge aussi...


Sites:

Introduction au langage Perl ( c'est quoi 'for', c'est quoi 'while', ...:
<http://www.med.univ-rennes1.fr/~poulique/cours/perl/perl_html/introperl42.html>

Les Mongueurs de Perl:
<http://paris.mongueurs.net/>
<http://articles.mongueurs.net/magazines/>

Salut;
-- 
(o_
(/)_
S e r g e


Reply to: