#!/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 & DUBREMETZ Marie</NOM>\n";
print TMP "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print TMP "<PARCOURS>\n";
print TMP "<NOM>BASCARANE Lydia & 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/</</g;
$texte =~ s/>/>/g;
$texte =~ s/<a href[^>]+>//g;
$texte =~ s/<img[^>]+>//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/<[^>]+>//g;
$texte =~ s/«//g;
$texte =~ s/»//g;
$texte =~ s/ / /g;
$texte=~s/&#39;/'/g;
$texte=~s/&#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);
}