#!/usr/bin/perl #on Importe les modules xml::rss et unicode;;string use XML::RSS; use Unicode::String qw(utf8); < et ; #- un fichier sortie structuré au format XML avec les mêmes contenus: DOC #----------------------------------------------------------- my $rep="$ARGV[0]"; # recupere le nom du repertoire e memorizo na variavel $rep # on s'assure que le nom du répertoire ne se termine pas par un "/" $rep=~ s/[\/]$//; # vamo normalizar e suprimimos o eventual chevron q possa aparecer no final do nome do repertoire # Initialisation de variables ------------------- # on initialise une variable contenant le flux de sortie my $DUMPXML=""; my $DUMPTXT=""; # numéro & nom de la rubrique, date de l'article traité my $num=""; my $rubrique=""; my $date=""; my %dictionnairedesrubriques=(); # dialogue avec l'utilisateur print "\nBonjour, vous êtes sur le nettoyeur de fils RSS du journal \"Le Monde\" !\n\n"; print "Entrez l'identifiant de la rubrique a traiter ou * si vous voulez toutes les rubriques : \n"; print "0 : A la une\t\t\t\t8 : Medias\n 1 : International\t\t\t9 : Rendez-vous\n 2 : Europe\t\t\t\t10 : Sports\n 3 : Livres\t\t\t\t11 : Opinions\n 4 : Cinema\t\t\t\t12 : Planete\n 5 : Technologies\t\t\t13 : Voyages\n 6 : Politique\t\t\t14 : Culture\n 7 : Economie\t\t\t15 : Societe\n ALL:* \n\n Votre choix : "; # Récupération de l'identifiant de la rubrique tapé par l'utilisateur $id = ; # Suppression du dernier caractère de retour à la ligne s'il y en a un chomp($id);#Choix de la rubrique ou de toutes les rubriques if ($id eq 0) {$num="3208";;$rubrique="a_la_une";} #lê-se se $id equivale a 0 elsif ($id eq 1) {$num="3210";$rubrique="international";} elsif ($id eq 2) {$num="3214";$rubrique="europe";} elsif ($id eq 3) {$num="3260";$rubrique="livres";} elsif ($id eq 4) {$num="3476";$rubrique="cinema";} elsif ($id eq 5) {$num="651865";$rubrique="technologie";} elsif ($id eq 6) {$num="823353";$rubrique="politique";} elsif ($id eq 7) {$num="3234";$rubrique="economie";} elsif ($id eq 8) {$num="3236";$rubrique="medias";} elsif ($id eq 9) {$num="3238";$rubrique="rendez-vous";} elsif ($id eq 10) {$num="3242";$rubrique="sport";} elsif ($id eq 11) {$num="3232";$rubrique="opinions";} elsif ($id eq 12) {$num="32344";$rubrique="planete";} elsif ($id eq 13) {$num="3246";$rubrique="voyages";} elsif ($id eq 14) {$num="3546";$rubrique="culture";} elsif ($id eq 15) {$num="3224";$rubrique="societe";} elsif ($id eq "*") {$num="ALL";$rubrique="toutes_les_rubriques";} else { print "Je n'ai pas compris, veuillez indiquer la rubrique à traiter\n"; } #----------------------------- # stockage des chemins et noms des différentes sorties my $output1_xml="SORTIE_RSS_$rubrique.xml"; my $output2_txt="SORTIE_RSS_$rubrique.txt"; #---------------------------------------------------------- # ouverture des fichiers de sortie my $encodagesortie="utf-8"; #on prepare nos sorties if (!open(OUTXML,">:encoding($encodagesortie)",$output1_xml)) { die "Pb a l'ouverture du fichier $output1_xml"}; if (!open(OUTTXT,">:encoding($encodagesortie)",$output2_txt)) { die "Pb a l'ouverture du fichier $output2_txt"}; #---------------------------------------- #On lance le parcours récursif via la procédure "parcoursarborescence" qui prend comme argument la variable "$rep" #Il va parcourir le répertoire dont le nom a été passé en paramètre au programme &parcoursarborescencefichiers($rep,$num); #recurse! on lance une procedure q percorre a arborescence du fichier,q é descrita + abaixo.muito importante ! #---------------------------------------- # Creation du fichier XML:les premières lignes de mon fichier print OUTXML "\n"; print OUTXML "\n"; print OUTXML "Votre nom\n"; print OUTXML "\n".$DUMPXML."\n"; print OUTXML "\n"; close(OUTXML); # Creation du fichier TXT print OUTTXT "$DUMPTXT"; close (OUTTXT); ## Fin du programme exit; ## Et on lance les procédures ### #---------------------------------------------- # Procédure parcoursarborescencefichiers #---------------------------------------------- sub parcoursarborescencefichiers { my ($path,$num) = @_; # @_ tableau des arguments passé en procedure, dans la variable $path, on a pour valeur, la valeur 2008(qui est un rep) opendir(DIR, $path) or die "can't open $path: $!\n"; # on ouvre le rep par opendir(pointeur de rep DIR qui est motclé pr fair reference au dossier physique caché derrière la variable) et nom de la variable. fonction die permet d'interrompre l'execution d'un programme et envoie à l'ecran le message d'erreur (idem que or exit) my @files = readdir(DIR); # readdir lit le contenu du rep, et prend comme argument le pointeur DIR, et renvoi comme valeur liste des elemts constitufs du repertoire q é um dossier, p entao tratar os elemts,se ser um rep, ele desce ainda,se for um arq, eu trato! a commande readdir renvoie comme valeur une liste des éléments constitutifs du répertoire (dossiers) fonction readdir renvoie aux fichiers, répertoire courant et répertoire parent closedir(DIR); #Pour chaque élément contenu dans le répertoire, on vérifie son type (Fichier ou Répertoire) foreach my $file (@files) { #foreach percorre uma lst e trata e me interesso aos elmst de cada list @file next if $file =~ /^\.\.?$/; # my $nomdefichier=$file; #On affecte à la variable "$file" le chemin complet de l'élément $file = $path."/".$file; # fichier q cheguei é $file mas é localizado em 2008.$file (fichier jan) la ressource est elle un répertoire ou un fichier? if (-d $file) { # -d $file sera vrai si é um rep e falso se é um fichier &parcoursarborescencefichiers($file,$num); #recurse! vamo colocar uma procedure de recursivite até q ele desca a um fichier #recurse! mis en oeuvre d'un mecanisme de récursivité jusqu'à epuisement; #ex 2008/jan, si répertoire la procedure est relancer ex 2008/jan/1, #quand on arrive sur des fichiers, arrêt de la récursivité } # -f $file vrai si fichier e false si for rep if ((-f $file) && ($file=~/.xml$/) && ($nomdefichier!~/^fil/)) { my $file2traite=""; #on initie une variable a vide if ($num eq "ALL") { #traitement de tous le fichiers $file2traite=$file; } else { if ($file=~/0,2-$num,1-0,0\.xml$/) { #traitement d'une rubrique en particulier $file2traite=$file; } } if ($file2traite ne "") { #print "contenu de $file : \n"; #lecture de $file print "FILE : <$file> \n"; open(FILE,$file); #quand je rencontre balise item et description j'extrais le texte entre les balises et j'imprime ! #print "Traitement de :\n$file\n"; my $texte1=""; while (my $ligne=) { $ligne =~ s/\n//g; $texte1 .= $ligne; } close(FILE); $texte1=~/encoding ?= ?[\'\"]([^\'\"]+)[\'\"]/i; my $encodage=$1; print "ENCODAGE : $encodage \n"; open(FILE,"<:encoding($encodage)", $file); my $texte=""; # $texte, j'inicialise à vide, my $rss=new XML::RSS; #on crée lobjet xml:rss vide avc "new",c'est possible grace àla biblio tt en haut.on garde valeur dns $rss qui est un pointeur vers 1 objet de type rss eval {$rss->parsefile($file); }; # parsefile verifie si ce fichier é bien formé,on cree objet complexe avc lensemble de données.si c'est mal formé,il sarrete!eval,permet d'evaluer le comport une cmmde e continuer si le resultat est bon ou pas. $@contient le resultat d'eval #print Dumper($rss),"\n";; #----------------------------------------------------------- if( $@ ) { # si le resultat est mauvais,jsignale qu'ily a une erreur. $@ contient le resultat de la commande qu'on evalue juste au dessus $@ =~ s/at \/.*?$//s; # remove module line number print STDERR "\nERROR in '$file':\n$@\n"; } else { # se commde est bonne, $DUMPXML.="\n"; my $date=$rss->{'channel'}->{'pubDate'}; # aller au $rss,chercher em channel la date de publication et je garde en $date $DUMPXML.="".$date."\n"; # jmets la date dans des balises dates $DUMPXML.="\n"; # description de balises items # extraction de contenu txtuel, utilisant la biblio RSS foreach my $item (@{$rss->{'items'}}) { # va me chercher tte la liste des items my $titre=$item->{'title'}; my $resume=$item->{'description'}; $titre=&nettoietexte($titre); $resume=&nettoietexte($resume); if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);} if (!(exists($dictionnairedesrubriques{$resume}))) { $DUMPTXT.="Titre : $titre \n"; $DUMPTXT.="Resume : $resume \n";; $DUMPXML.="$titre$resume\n"; $DUMPTMP.=" $titre $resume\n"; $dictionnairedesrubriques{$resume}++; } else { $dictionnairedesrubriques{$resume}++; } } } $DUMPXML.="\n\n"; close(FILE); } } } } #---------------------------------------------- sub nettoietexte { my $texte=shift; #prend une entrée un parametre et revoie une valeur de la chaine de caracteres nettoyé.fonction shift je vide le tableau des arguments passé à la procédure #ce nettoyage est insuffisant $texte =~ s/<//g; $texte =~ s/]+>//g; $texte =~ s/]+>//g; $texte =~ s/<\/a>//g; $texte =~ s/&#39;/'/g; $texte =~ s/&#34;/"/g; $texte =~ s/<[^>]+>//g; $texte =~s/'/\'/g; $texte =~s/"/\"/g; $texte =~s/é/é/g; $texte =~s/ê/ê/g; $texte =~s/&eacute;/é/g; $texte =~s/&egrave;/è/g; $texte =~s/&icirc;/\î/g; $texte =~s/&ocirc;/\ô/g; $texte =~s/&ccedil;/\ç/g; $texte =~s/&agrave;/\à/g; $texte =~s/&/&/g; $texte =~s/<.*$//g; $texte =~ s/&|&/&/g; $texte =~ s/&|&/&/g; $texte =~ s/'|'/'/g; $texte =~ s/ | /? /g; $texte =~ s/­|­/­/g; $texte =~ s/"|"/"/g; $texte =~ s/«|«/«/g; $texte =~ s/»|»/»/g; $texte =~ s/‹|‹/‹/g; $texte =~ s/›|›/›/g; $texte =~ s/“|“/“/g; $texte =~ s/”|”/”/g; $texte =~ s/„|„/„/g; $texte =~ s/‘|‘/‘/g; $texte =~ s/„|„/„/g; $texte =~ s/’|’/’/g; $texte =~ s/‚|‚/‚/g; $texte =~ s/…|…/…/g; $texte =~ s/!|!/!/g; $texte =~ s/¡|¡/¡/g; $texte =~ s/\?|?/\?/g; $texte =~ s/\(|(/\(/g; $texte =~ s/\)|)/\)/g; $texte =~ s/\[|[/\[/g; $texte =~ s/]|]/]/g; $texte =~ s/{|{/{/g; $texte =~ s/}|}/}/g; $texte =~ s/¨|¨/¨/g; $texte =~ s/´|´/´/g; $texte =~ s/`|`/`/g; $texte =~ s/\^|^/\^/g; $texte =~ s/ˆ|ˆ/ˆ/g; $texte =~ s/~|~/~/g; $texte =~ s/#|#/#/g; $texte =~ s/\*|*/\*/g; $texte =~ s/,|,/,/g; $texte =~ s/\.|./\./g; $texte =~ s/:|:/:/g; $texte =~ s/;|;/;/g; $texte =~ s/·|·/·/g; $texte =~ s/•|•/•/g; $texte =~ s/¯|¯/¯/g; $texte =~ s/-|-/-/g; $texte =~ s/–|–/–/g; $texte =~ s/—|—/—/g; $texte =~ s/_|_/_/g; $texte =~ s/\|||/\|/g; $texte =~ s/¦|¦/¦/g; $texte =~ s/‍|‍/?/g; $texte =~ s/†|†/†/g; $texte =~ s/‡|‡/‡/g; $texte =~ s/‡|‡/‡/g; $texte =~ s/§|§/§/g; $texte =~ s/¶|¶/¶/g; $texte =~ s/©|©/©/g; $texte =~ s/®|®/®/g; $texte =~ s/™|™/™/g; $texte =~ s/@|@/@/g; $texte =~ s/\/|//\//g; $texte =~ s/\\|\/\\/g; $texte =~ s/◊|◊/?/g; $texte =~ s/♠|♠/?/g; $texte =~ s/♣|♣/?/g; $texte =~ s/♥|♥/?/g; $texte =~ s/♦|♦/?/g; $texte =~ s/←|←/?/g; $texte =~ s/↑|↑/?/g; $texte =~ s/→|→/?/g; $texte =~ s/↓|↓/?/g; $texte =~ s/↔|↔/?/g; $texte =~ s/á|á/á/g; $texte =~ s/Á|Á/Á/g; $texte =~ s/â|â/â/g; $texte =~ s/Â|Â/Â/g; $texte =~ s/à|à/à/g; $texte =~ s/À|À/À/g; $texte =~ s/å|å/å/g; $texte =~ s/Å|Å/Å/g; $texte =~ s/ã|ã/ã/g; $texte =~ s/Ã|Ã/Ã/g; $texte =~ s/ä|ä/ä/g; $texte =~ s/Ä|Ä/Ä/g; $texte =~ s/æ|æ/æ/g; $texte =~ s/Æ|Æ/Æ/g; $texte =~ s/ç|ç/ç/g; $texte =~ s/Ç|Ç/Ç/g; $texte =~ s/é|é/é/g; $texte =~ s/É|É/É/g; $texte =~ s/ê|ê/ê/g; $texte =~ s/Ê|Ê/Ê/g; $texte =~ s/è|è/è/g; $texte =~ s/È|È/È/g; $texte =~ s/ë|ë/ë/g; $texte =~ s/Ë|Ë/Ë/g; $texte =~ s/í|í/í/g; $texte =~ s/Í|Í/Í/g; $texte =~ s/î|î/î/g; $texte =~ s/Î|Î/Î/g; $texte =~ s/ì|ì/ì/g; $texte =~ s/Ì|Ì/Ì/g; $texte =~ s/ï|ï/ï/g; $texte =~ s/Ï|Ï/Ï/g; $texte =~ s/ñ|ñ/ñ/g; $texte =~ s/Ñ|Ñ/Ñ/g; $texte =~ s/ó|ó/ó/g; $texte =~ s/Ó|Ó/Ó/g; $texte =~ s/ô|ô/ô/g; $texte =~ s/Ô|Ô/Ô/g; $texte =~ s/ò|ò/ò/g; $texte =~ s/Ò|Ò/Ò/g; $texte =~ s/ø|ø/ø/g; $texte =~ s/Ø|Ø/Ø/g; $texte =~ s/õ|õ/õ/g; $texte =~ s/Õ|Õ/Õ/g; $texte =~ s/ö|ö/ö/g; $texte =~ s/Ö|Ö/Ö/g; $texte =~ s/œ|œ/œ/g; $texte =~ s/Œ|Œ/Œ/g; $texte =~ s/š|š/š/g; $texte =~ s/Š|Š/Š/g; $texte =~ s/ß|ß/ß/g; $texte =~ s/ð|ð/ð/g; $texte =~ s/Ð|Ð/Ð/g; $texte =~ s/þ|þ/þ/g; $texte =~ s/Þ|Þ/Þ/g; $texte =~ s/ú|ú/ú/g; $texte =~ s/Ú|Ú/Ú/g; $texte =~ s/û|û/û/g; $texte =~ s/Û|Û/Û/g; $texte =~ s/ù|ù/ù/g; $texte =~ s/Ù|Ù/Ù/g; $texte =~ s/ü|ü/ü/g; $texte =~ s/Ü|Ü/Ü/g; $texte =~ s/ý|ý/ý/g; $texte =~ s/Ý|Ý/Ý/g; $texte =~ s/ÿ|ÿ/ÿ/g; $texte =~ s/Ÿ|Ÿ/Ÿ/g; $texte =~ s/¤|¤/¤/g; $texte =~ s/€|€/€/g; $texte =~ s/\$|$/\$/g; $texte =~ s/¢|¢/¢/g; $texte =~ s/£|£/£/g; $texte =~ s/¥|¥/¥/g; $texte =~ s/ƒ|ƒ/ƒ/g; $texte =~ s/α|α/a/g; $texte =~ s/Α|Α/?/g; $texte =~ s/β|β/ß/g; $texte =~ s/Β|Β/?/g; $texte =~ s/γ|γ/?/g; $texte =~ s/Γ|Γ/G/g; $texte =~ s/δ|δ/d/g; $texte =~ s/Δ|Δ/?/g; $texte =~ s/ε|ε/e/g; $texte =~ s/Ε|Ε/?/g; $texte =~ s/ζ|ζ/?/g; $texte =~ s/Ζ|Ζ/?/g; $texte =~ s/η|η/?/g; $texte =~ s/Η|Η/?/g; $texte =~ s/θ|θ/?/g; $texte =~ s/Θ|Θ/T/g; $texte =~ s/ι|ι/?/g; $texte =~ s/Ι|Ι/?/g; $texte =~ s/κ|κ/?/g; $texte =~ s/Κ|Κ/?/g; $texte =~ s/λ|λ/?/g; $texte =~ s/Λ|Λ/?/g; $texte =~ s/μ|μ/µ/g; $texte =~ s/Μ|Μ/?/g; $texte =~ s/ν|ν/?/g; $texte =~ s/Ν|Ν/?/g; $texte =~ s/ξ|ξ/?/g; $texte =~ s/Ξ|Ξ/?/g; $texte =~ s/ο|ο/?/g; $texte =~ s/Ο|Ο/?/g; $texte =~ s/π|π/p/g; $texte =~ s/Π|Π/?/g; $texte =~ s/ρ|ρ/?/g; $texte =~ s/Ρ|Ρ/?/g; $texte =~ s/σ|σ/s/g; $texte =~ s/ς|ς/?/g; $texte =~ s/Σ|Σ/S/g; $texte =~ s/τ|τ/t/g; $texte =~ s/Τ|Τ/?/g; $texte =~ s/υ|υ/?/g; $texte =~ s/Υ|Υ/?/g; $texte =~ s/φ|φ/f/g; $texte =~ s/Φ|Φ/F/g; $texte =~ s/χ|χ/?/g; $texte =~ s/Χ|Χ/?/g; $texte =~ s/ψ|ψ/?/g; $texte =~ s/Ψ|Ψ/?/g; $texte =~ s/ω|ω/?/g; $texte =~ s/Ω|Ω/O/g; $texte =~ s/°|°/°/g; $texte =~ s/µ|µ/µ/g; $texte =~ s/<|<//g; $texte =~ s/≤|≤/=/g; $texte =~ s/≥|≥/=/g; $texte =~ s/=|=/=/g; $texte =~ s/≈|≈/˜/g; $texte =~ s/≠|≠/?/g; $texte =~ s/≡|≡/=/g; $texte =~ s/±|±/±/g; $texte =~ s/−|−/-/g; $texte =~ s/\+|+/\+/g; $texte =~ s/×|×/×/g; $texte =~ s/÷|÷/÷/g; $texte =~ s/⁄|⁄//g; $texte =~ s/%|%/%/g; $texte =~ s/‰|‰/‰/g; $texte =~ s/¼|¼/¼/g; $texte =~ s/½|¼/½/g; $texte =~ s/¾|¼/¾/g; $texte =~ s/¹|¹/¹/g; $texte =~ s/²|²/²/g; $texte =~ s/³|³/³/g; $texte =~ s/º|º/º/g; $texte =~ s/ª|ª/ª/g; $texte =~ s/ƒ|ƒ/ƒ/g; $texte =~ s/′|′/'/g; $texte =~ s/″|″/?/g; $texte =~ s/∂|∂/?/g; $texte =~ s/∏|∏/?/g; $texte =~ s/∑|∑/?/g; $texte =~ s/√|√/v/g; $texte =~ s/∞|∞/8/g; $texte =~ s/¬|¬/¬/g; $texte =~ s/∩|∩/n/g; $texte =~ s/∫|∫/?/g; $texte =~ s/<.+?>//g; return $texte; } #-----------------------------------------------------------