#!/usr/bin/perl use HTML::Entities (); use Unicode::String qw(utf8); <<DOC; BASCARANE Lydia & DUBREMETZ Marie FEVRIER 2011 perl bascarane_dubremetz.pl 2009 perl bascarane_dubremetz.pl 2010 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter Le programme construit en sortie un fichier structuré contenant sur chaque ligne le nom du fichier et le résultat du filtrage : <FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER> DOC #----------------------------------------------------------- my $rep="$ARGV[0]"; # on s'assure que le nom du répertoire ne se termine pas par un "/" $rep=~ s/[\/]$//; # Initialisation des différentes variables # numéro & nom de la rubrique, date de l'article traité my $num=""; my $rubrique=""; my $date=""; my $id=""; my $liste=""; my $annee=""; my $ligne=""; my $jour=""; my $mois=""; my $titre=""; my $contenu=""; my $contenuformate=""; my $contenuxml=""; my $contenutxt=""; my $nomrub=""; my $file=""; my $texte=""; my %dictionnairedesitems=(); my $DUMPXML=""; my $DUMPTXT=""; my $DUMPLEXICO=""; my $DUMPTMP=""; # afin d'utiliser des balises '<fichier>' et de structurer le tableau des résultats my $DUMPTMP2=""; # idem, mais pour Cordial (on insère des anotations de début de fichier) # dialogue avec l'utilisateur print "\nBienvenue sur le filtreur-nettoyeur de fils RSS \"Le Monde\" !\n\n"; print "Entrez l'identifiant de la rubrique a traiter : \n"; print "0 : A la une\t\t\t\t9 : Opinions\n 1 : International\t\t\t10 : Planete\n 2 : Europe\t\t\t\t11 : Voyages\n 3 : Livres\t\t\t\t12 : Culture\n 4 : Cinema\t\t\t\t13 : Societe\n 5 : Technologies\t\t\t14 : Economie\n 6 : Medias\t\t\t\t15 : Examens\n 7 : Rendez-vous\t\t\t\t16 : Politique\n 8 : Sports\n"; # Récupération de l'identifiant de la rubrique tapé par l'utilisateur $id = <STDIN>; # Suppression du dernier caractère de retour à la ligne s'il y en a un chomp($id); # Choix de la rubrique my @liste= ("3208","3210","3260","3476","651865","3236","3238","3242","3232","3244","3546","3246","3224","3234","3404","823353"); if ($id eq 0) {$num="3208";$nomrub="aLaUne"} elsif ($id eq 1) {$num="3210";$nomrub="international"} elsif ($id eq 2) {$num="3214";$nomrub="europe"} elsif ($id eq 3) {$num="3260";$nomrub="livres"} elsif ($id eq 4) {$num="3476";$nomrub="cinema"} elsif ($id eq 5) {$num="651865";$nomrub="technologies"} elsif ($id eq 6) {$num="3236";$nomrub="medias"} elsif ($id eq 7) {$num="3238";$nomrub="rendezVous"} elsif ($id eq 8) {$num="3242";$nomrub="sports"} elsif ($id eq 9) {$num="3232";$nomrub="opinions"} elsif ($id eq 10) {$num="3244";$nomrub="planete"} elsif ($id eq 11) {$num="3546";$nomrub="voyages"} elsif ($id eq 12) {$num="3246";$nomrub="culture"} elsif ($id eq 13) {$num="3224";$nomrub="societe"} elsif ($id eq 14) {$num="3234";$nomrub="economie"} elsif ($id eq 15) {$num="3404";$nomrub="examens_$rep"} elsif ($id eq 16) {$num="823353";$nomrub="politique"} else { print "Hum... Je n'ai pas compris : je traiterai donc la rubrique 'A la Une'\n";$num="3208";$nomrub="aLaUne"} #---------------------------------------- system("mkdir -p SORTIE_$rep"); my $outputxml="SORTIE_$rep/SORTIE_$nomrub.xml"; my $outputtxt="SORTIE_$rep/SORTIE_$nomrub.txt"; my $outputlexico="SORTIE_$rep/SORTIE_formatlexico3_$nomrub.txt"; my $outputtmp="SORTIE_$rep/SORTIE_pour_TreeTagger_$nomrub.xml"; my $outputtmp2="SORTIE_$rep/SORTIE_pour_Cordial_$nomrub.txt"; if (!open (OUTPUTXML,">:encoding(utf-8)",$outputxml)) { die "Pb a l'ouverture du fichier $outputxml"}; if (!open (OUTPUTTXT,">:encoding(utf-8)", $outputtxt)) { die "Pb a l'ouverture du fichier $outputtxt"}; if (!open (LEXICO,">:encoding(utf-8)", $outputlexico)) { die "Pb a l'ouverture du fichier $outputlexico"}; if (!open (TMP,">:encoding(utf-8)", $outputtmp)) { die "Pb a l'ouverture du fichier $outputtmp"}; if (!open (TMP2,">:encoding(utf-8)", $outputtmp2)) { die "Pb a l'ouverture du fichier $outputtmp2"}; print OUTPUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"; print OUTPUTXML "<PARCOURS>\n"; print OUTPUTXML "<NOM>BASCARANE Lydia &amp; DUBREMETZ Marie</NOM>\n"; print TMP "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"; print TMP "<PARCOURS>\n"; print TMP "<NOM>BASCARANE Lydia &amp; DUBREMETZ Marie</NOM>\n"; close(OUTPUTXML); close(OUTPUTTXT); close(LEXICO); close(TMP); close(TMP2); &parcoursarborescencefichiers($rep,$num,$nomrub); $outputxml="SORTIE_$rep/SORTIE_$nomrub.xml"; if (!open (OUTPUTXML,">>:encoding(utf-8)", $outputxml)) { die "Pb a l'ouverture du fichier $outxml"}; print OUTPUTXML "</PARCOURS>\n"; close(OUTPUTXML); $outputtmp="SORTIE_$rep/SORTIE_pour_TreeTagger_$nomrub.xml"; if (!open (TMP,">>:encoding(utf-8)", $outputtmp)) { die "Pb a l'ouverture du fichier $outputtmp"}; print TMP "</PARCOURS>\n"; close(TMP); exit; sub parcoursarborescencefichiers { my ($path,$num,$nomrub) = @_; #vide la première ligne du tableau: "_" contient 2008 opendir(DIR, $path) or die "can't open $path: $!\n";# definit un pointeur de repertoire #die permet de sortie: comme exit my @files = readdir(DIR); #lire le contenu du repertoire et utilise le poiteur du repertoire # renvoie une liste des elements constitutifs des éléments du repertoire= @files closedir(DIR); foreach my $file (@files) { #chaque element de la liste: un traitement différent next if $file =~ /^\.\.?$/;# passer au suivant si le fichier n'existe pas $file = $path."/".$file; #héritage du chemin père if (-d $file) { #appliquer la fonction si la ressource est un repertoire/un fichier: -d (repertoire), -f (fichier) &parcoursarborescencefichiers($file,$num,$nomrub); #recurse! } if (-f $file) { if(($file =~ /0,2-$num,1-0,0\.xml$/) || ($file =~ /0,57-0,64-$num,0\.xml$/)) { open(FILE, $file); my $texte=""; while (my $ligne=<FILE>) { #print $ligne; $ligne =~ s/\n//g; $texte .= $ligne; } close(FILE); $texte=~/encoding ?= ?[\'\"]([^\'\"]+)[\'\"]/i; my $encodage=$1; if ($encodage ne "") { print "Extraction dans : $file ($encodage) \n"; my $DUMPXML="<file>\n"; $DUMPXML.="<name>$file</name>\n"; my $DUMPTMP="<file>\n"; my $DUMPTMP2=""; $DUMPTMP.="<name>$file</name>\n"; $texte =~ s/> *</></g; $texte=~/<pubDate>([^<]+)<\/pubDate>/; $DUMPXML.="<date>$1</date>\n"; ## tester sinon <FICHIER num=\"$i\" date=\"$date\"> $DUMPXML.="<items>\n"; $DUMPTMP.="<date>$1</date>\n"; $DUMPTMP.="<items>\n"; my $DUMPLEXICO=""; my $DUMPTXT=""; open(FILE,"<:encoding($encodage)", $file); #print "Traitement de :\n$file\n"; $texte=""; while (my $ligne=<FILE>){ #FICHIER $ligne =~ s/\n//g; $texte .= $ligne; } close(FILE); $texte=~s/> *</></g; #print $texte; # on recherche la rubrique if ($texte =~ /<channel><title>(.*?Le Monde\.fr.*?)<\/title><link>/) { $rubrique = $1; } #print $rubrique,"\n"; my $date=""; # Récupération de la date de l'article if ($texte =~ /<lastBuildDate>(.+200.).+\ ?<\/lastBuildDate>/) { $date = $1; # récupération de l'année pour la balise <DESC> de la sortie xml if ($date =~ /.*(\d+)\s(\w+)\s(20\d\d).*/) { my $jour=$1; my $mois=$2; my $annee=$3; $date="<date=".$3.$2.$1.">"; } } #---------------------------------------- my $outputxml="SORTIE_$rep/SORTIE_$nomrub.xml"; my $outputtxt="SORTIE_$rep/SORTIE_$nomrub.txt"; my $outputlexico="SORTIE_$rep/SORTIE_formatlexico3_$nomrub.txt"; my $outputtmp="SORTIE_$rep/SORTIE_pour_TreeTagger_$nomrub.xml"; my $outputtmp2="SORTIE_$rep/SORTIE_pour_Cordial_$nomrub.txt"; if (!open (OUTPUTXML,">>:encoding(utf-8)",$outputxml)) { die "Pb a l'ouverture du fichier $outputxml"}; if (!open (OUTPUTTXT,">>:encoding(utf-8)", $outputtxt)) { die "Pb a l'ouverture du fichier $outputtxt"}; if (!open (LEXICO,">>:encoding(utf-8)", $outputlexico)) { die "Pb a l'ouverture du fichier $outputlexico"}; if (!open (TMP,">>:encoding(utf-8)", $outputtmp)) { die "Pb a l'ouverture du fichier $outputtmp"}; if (!open (TMP2,">>:encoding(utf-8)", $outputtmp2)) { die "Pb a l'ouverture du fichier $outputtmp2"}; #---------------------------------------- my $compteurItem=0; my $compteurEtiquetage=0; while ($texte =~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>.+?<pubDate>(.+?)<\/pubDate>/g) { my $titre=$1; my $resume=$2; my $date=$3; print "Titre à traiter : \n$titre \n\n\nResume a traiter :\n$resume \n"; if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);} $titre = &nettoietexte($titre); $resume = &nettoietexte($resume); $date=&nettoietexte($date); $compteurItem++; if (!(exists($dictionnairedesitems{$resume}))) { $compteurEtiquetage++; print "Etiquetage (num : $compteurEtiquetage) sur item (num : $compteurItem) \n"; my ($titreetiquete,$texteetiquete)=&etiquetageavectreetagger($titre,$resume,$nomrub); $DUMPTXT.="# $titre \n"; $DUMPTXT.="# $resume \n"; $DUMPTMP2.="$titre \n"; $DUMPTMP2.="$resume \n"; $DUMPLEXICO.="<date=$date>\n<type=titre> # $titre \n"; $DUMPLEXICO.="<type=resume> # $resume \n"; $DUMPXML.="<item><title>$titre</title><abstract>$resume</abstract></item>\n"; $DUMPTMP.="<item>\n<title>\n$titreetiquete</title>\n<abstract>\n$texteetiquete</abstract>\n</item>\n"; $dictionnairedesitems{$resume}++; } else { $DUMPXML.="<item><title>-</title><abstract>-</abstract></item>\n"; } } $DUMPXML.="</items>\n</file>\n"; $DUMPTMP.="</items>\n</file>\n"; print OUTPUTXML $DUMPXML; print OUTPUTTXT $DUMPTXT; print TMP $DUMPTMP; print TMP2 $DUMPTMP2; print LEXICO $DUMPLEXICO; close OUTPUTXML; close OUTPUTTXT; close TMP; close TMP2; close LEXICO; } else { print "$file ==> $encodage \n"; } } else { print "encodage pas detecte...\n"; } } } } #On crée la procédure "nettoyage" sub nettoietexte { my $texte=shift; $texte =~ s/&lt;/</g; $texte =~ s/&gt;/>/g; $texte =~ s/<a href[^>]+>//g; $texte =~ s/<img[^>]+>//g; $texte =~ s/<\/a>//g; $texte =~ s/&#38;#39;/'/g; $texte =~ s/&#38;#34;/"/g; $texte =~ s/&#233;/é/g; $texte =~ s/&#234;/ê/g; $texte =~ s/&#39;/'/g; $texte =~ s/&#34;/"/g; $texte =~ s/&amp;//g; $texte =~ s/<[^>]+>//g; $texte =~ s/«//g; $texte =~ s/»//g; $texte =~ s/&nbsp;/ /g; $texte=~s/&amp;#39;/'/g; $texte=~s/&amp;#34;/"/g; $texte=~s/#39;/'/g; $texte=~s/#34;/"/g; return $texte; } sub etiquetageavectreetagger { my ($titre,$texte,$nomrub)=@_; #----- le titre my $codage="utf-8"; my $tmptag="input_TreeTagger.txt"; open (TMPZZ,">:encoding(utf-8)", $tmptag); print TMPZZ $titre,"\n"; close(TMPZZ); system("perl ./TreeTagger/tokenise-fr.pl $tmptag | tree-tagger.exe ./TreeTagger/french-utf8.par -lemma -token -no-unknown -sgml > TreeTagger.txt"); system("perl ./TreeTagger/treetagger2xml-utf8.pl TreeTagger.txt $codage "); # lecture du resultat tagge en xml : open(OUTZZ,"<:encoding(utf-8)","TreeTagger.txt.xml"); my $fistline=<OUTZZ>; my $titreetiquete=""; while (my $l=<OUTZZ>) { $titreetiquete.=$l; } close(OUTZZ); #----- le resume $tmptag="input_TreeTagger.txt"; open (TMPZZ,">:encoding(utf-8)", $tmptag); print TMPZZ $texte,"\n"; close(TMPZZ); system("perl ./TreeTagger/tokenise-fr.pl $tmptag | tree-tagger.exe ./TreeTagger/french-utf8.par -lemma -token -no-unknown -sgml > TreeTagger.txt"); system("perl ./TreeTagger/treetagger2xml-utf8.pl TreeTagger.txt $codage "); # lecture du resultat tagge en xml : open(OUTZZ,"<:encoding(utf-8)","TreeTagger.txt.xml"); my $fistline=<OUTZZ>; my $texteetiquete=""; while (my $l=<OUTZZ>) { $texteetiquete.=$l; } close(OUTZZ); return($titreetiquete,$texteetiquete); }