BAO 1

BAO 1

Extraction du titre et de chaque article du flux RSS de Le Monde dans un fichier XML et TXT.

Des fichiers XML qui sont les flux RSS, desquels on extrait le titre et la description.

Des fichiers TXT, qui sont donc des fichiers au format brut, que l'on extrait en format TXT, mais par rubriques.


Grâce aux indications, explications et exemples de nos professeurs nous avons pu réaliser un script utilisant le langage PERL et nous permettant d'obtenir les résultats attendus pour 4 rubriques du flux RSS du Journal Le Monde.

Script PERL de la BAO 1:

Traitant le titre et la description des articles (la surface).

									
#/usr/bin/perl

use warnings;
use strict;

<<DOC; 
Votre Nom : COLLOMB-ALFONSO
JANVIER 2016
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 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
#----------------START-Arguments-Entree-(input)----------------
my $rep="$ARGV[0]";
my $rubrique = "3246|651865|3476|3260";
my %dico;
$rep=~ s/[\/]$//;
#----------------END-Arguments-Entree-(input)----------------

#----------------START-Declaration-Variables---------------
my $output1="2015-3246.xml";
my $output2="2015-651865.xml";
my $output3="2015-3476.xml";
my $output4="2015-3260.xml";
#----------------END-Declaration-Variables----------------

#----------------START-Enregistrement-Texte-Entete---------------
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output3")) { die "Pb a l'ouverture du fichier $output3"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output4")) { die "Pb a l'ouverture du fichier $output4"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
#----------------END-Enregistrement-Texte-Entete----------------

#----------------START-Appel-Fonction---------------
&parcoursarborescencefichiers($rep);	
#----------------END-Appel-Fonction----------------

#----------------START-Enregistrement-Texte-Fil-RSS---------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output2);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output3);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output4);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);

exit ;
#----------------END-Enregistrement-Texte-Fil-RSS----------------

#----------------START-Definition-Fonction---------------
sub  parcoursarborescencefichiers 
	{
	#definition du repertoire de lecture comme l'element passe en argument
    my $path= shift(@_);
    opendir (DIR, $path) or die "can't open $path: $!\n";
	
	#definition d'une liste contenant le nom de chaque fichier du repertoire
    my @files = readdir(DIR);
    closedir (DIR);
	
	#boucle permettant de parcourir la liste contenant le nom des fichiers
    foreach  my $file (@files) 
		{
		#reconnaissance des lignes porteuses des informations pertinentes
		next  if $file =~ /^\.\.?$/;
		
		#definition du chemin du fichier un par un
		$file = $path."/".$file;
		
		#condition verifiant si le repertoire existe et mémorise des
		#balises dans le fichier de résultat en début et en fin
		if (-d $file) 
			{
			print  "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers ($file);
			print  "<FIN REPERTOIRE> ==> ",$file,"\n";
			}
			
		#condition verifiant si le fichier existe
		if (-f $file) 
			{
			#condition verifiant si le fichier correspond au numero de rubrique
            if ($file =~ /($rubrique).+\.xml$/) 
				{
				#implementation d'un compteur
				my $numeroDerniereRubrique = $1;
                print  "<",$i++,"> ==> ",$file,"\n\n\n";
				
				#definition de variables ouvrant des fichiers en mode d'ecriture
				#dans un encodage UTF-8
                $codage = "utf-8";
                open (FIC, "<:encoding($codage)", $file);
                open (OUT, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.txt");
                open (OUT2, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.xml");
				
				#definition de variable afin d'y ajouter le texte ligne par ligne
                my $texte="";
				
				#boucle parcourant chaque ligne de texte du fichier
                while (my $ligne = ) 
					{
					#mise en forme de la ligne de texte
                    chomp $ligne;
                    $ligne =~ s/\r//g;
                    $texte = $texte . $ligne;
					}
				#fermeture du fichier
                close FIC;
				
				#mise en forme de la variable
                $texte =~s/>\s+</></g;
				
				#definition de compteur et boucle recherchant les
				#elements titre et description dans le texte
				my $compteurArticle = 1 ;
                while ($texte =~m/<item>< title>([^<]+?)<\/ title>< link>(?:[^<]+?)<\/ link><description>([^<]+?)<\/description>/g) 
					{
						#definition des variables et mise en forme des elements tite et description
						my $titre = $1;
                        my $description = $2;
                        $titre=~s/<.+?>.+&.//g;
                        $titre.=".";
                        $titre=~s/\?\.$/\?/;
                        $description=~s/<.+?>//g;
						
						#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
						#le fichier resultat les balises et le contenu du compteur d'articles, du
						#titre et de la description
                        if (!(exists  $dico{$titre})) 
							{
                            $dico{$titre} = 1;
							my $compteurArticle  = $compteurArticle++;
                            print  OUT "$titre\n";
                            print  OUT "$description\n\n";
                            print  OUT2 "<item num=\"$compteurArticle\" >\n< title>$titre</ title>\n<description>$description</description>\n</item>\n\n";       
							}
					}
				#fermeture des fichiers
                close OUT;
                close OUT2;
                # fin de traitement du fichier
				}
			}
		}
	}
#----------------END-Definition-Fonction---------------
									
								

Script PERL de la BAO 1:

Traitant le titre et tout le contenu des articles (la profondeur), en plus de la surface.

									
#/usr/bin/perl

#use warnings;
#use strict;

<<DOC; 
Votre Nom : COLLOMB-ALFONSO
JANVIER 2016
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 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
#----------------START-Arguments-Entree-(input)----------------
my $rep="$ARGV[0]";
my $rubrique = "3246|651865|3476|3260";
my %dico;
$rep=~ s/[\/]$//;
#----------------END-Arguments-Entree-(input)----------------

#----------------START-Declaration-Variables---------------
my $output1="2015-3246.xml";
my $output2="2015-651865.xml";
my $output3="2015-3476.xml";
my $output4="2015-3260.xml";
#----------------END-Declaration-Variables----------------

#----------------START-Enregistrement-Texte-Entete---------------
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print  FILEOUT "\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output3")) { die "Pb a l'ouverture du fichier $output3"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output4")) { die "Pb a l'ouverture du fichier $output4"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
#----------------END-Enregistrement-Texte-Entete----------------

#----------------START-Appel-Fonction---------------
&parcoursarborescencefichiers($rep);	
#----------------END-Appel-Fonction----------------

#----------------START-Enregistrement-Texte-Fil-RSS---------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output2);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output3);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output4);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);

exit ;
#----------------END-Enregistrement-Texte-Fil-RSS----------------

#----------------START-Definition-Fonction---------------
sub  parcoursarborescencefichiers 
	{
	#definition du repertoire de lecture comme l'element passe en argument
    my $path= shift(@_);
    opendir (DIR, $path) or die "can't open $path: $!\n";
	
	#definition d'une liste contenant le nom de chaque fichier du repertoire
    my @files = readdir(DIR);
    closedir (DIR);
	
	#boucle permettant de parcourir la liste contenant le nom des fichiers
    foreach  my $file (@files) 
		{
		#reconnaissance des lignes porteuses des informations pertinentes
		next  if $file =~ /^\.\.?$/;
		
		#definition du chemin du fichier un par un
		$file = $path."/".$file;
		
		#condition verifiant si le repertoire existe et enregistrant des
		#balises dans le fichier de résultat en début et en fin
		if (-d $file) 
			{
			print  "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers ($file);
			print  "<FIN REPERTOIRE> ==> ",$file,"\n";
			}
			
		#condition verifiant si le fichier existe
		if (-f $file) 
			{
			#condition verifiant si le fichier correspond au numero de rubrique
            if ($file =~ /($rubrique).+\.xml$/) 
				{
				#implementation d'un compteur
				my $numeroDerniereRubrique = $1;
                print  "<",$i++,"> ==> ",$file,"\n\n\n";
				
				#definition de variables ouvrant des fichiers en mode d'ecriture
				#dans un encodage UTF-8
                $codage = "utf-8";
                open (FIC, "<:encoding($codage)", $file);
                open (OUT, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.txt");
                open (OUT2, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.xml");
				
				#definition de variable afin d'y ajouter le texte ligne par ligne
                my $texte="";
				
				#boucle parcourant chaque ligne de texte du fichier
                while (my $ligne = <FIC>) 
					{
					#mise en forme de la ligne de texte
                    chomp $ligne;
                    $ligne =~ s/\r//g;
                    $texte = $texte . $ligne;
					}
				#fermeture du fichier
                close FIC;
				
				#mise en forme de la variable
                $texte =~ s/>\s+</></g;
				
				#definition de compteur et boucle recherchant les
				#elements titre et description dans le texte
				my $compteurArticle = 1 ;
                while ($texte =~m/<item>< title>([^<]+?)<\/ title>< link>(?:[^<]+?)<\/ link><description>([^<]+?)<\/description>/g) 
					{
						#definition des variables et mise en forme des elements tite et description
						my $titre = $1;
                        my $description = $2;
                        $titre=~s/<.+?>.+&.//g;
                        $titre.=".";
                        $titre=~s/\?\.$/\?/;
                        $description=~s/<.+?>//g;
						
						#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
						#le fichier resultat les balises et le contenu du compteur d'articles, du
						#titre et de la description
                        if (!(exists  $dico{$titre})) 
							{
                            $dico{$titre} = 1;
							my $compteurArticle  = $compteurArticle++;
                            print  OUT "$titre\n";
                            print  OUT "$description\n\n";
                            print  OUT2 "$compteurArticle\" >\n< title>$titre</ title>\n<description>$description</description>\n</item>\n\n";       
							}
					}
				#fermeture des fichiers
                close OUT;
                close OUT2;
                # fin de traitement du fichier
				}
			#######################################################################################
			#ICI COMMENCE LA SECTION DU SCRIPT EXCLUSIVE DE LA PROFONDEUR			
			#######################################################################################
			#condition appelant le fichier TXT
			if ($file =~ /($rubrique).+\.txt$/) 
				{
		        my $rubriquereconnnue=$1;
                print "< PPPPPP",$i++,"> ==> ",$file,"\n\n\n";
				
				#definition de variables ouvrant des fichiers en mode d'ecriture
				#dans un encodage UTF-8
                $codage = "utf-8";
                open (FIC2, "<:encoding($codage)", $file);
                open (OUT3, ">>:encoding($codage)", "Profond$rubriquereconnnue.txt");
				
				#definition de variable afin d'y ajouter le texte ligne par ligne
                my $texteProfond="";
					
					#boucle parcourant chaque ligne de texte du fichier
					while (my $ligne=<FIC2>) 
						{
						#condition excluant des éléments présents dans les lignes de texte
						if (($ligne!~/[<>\|]/))
							{
							#condition excluant des éléments présentas dans les lignes de texte
							if (($ligne!~/^(\s|\n|Le Monde|Journaliste|Suivre|Aller|Lire|Suivre|\d\d.\d\d.\d\d\d\d|\/|\]|\}|\{|\\|require|Découvrir|Article sélectionné| la matinale|La sélection du|Voir aussi|Photo(s)?|Texte|(\()?function.|sdk.|Image|Rejouer|Accédez|GMURZYNSKA.|stall.|\"|\'|initCharts\)|\$.|if|Highcharts.|Réagir|Classer|Email|Partager)/))
								{
								#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
								#le fichier resultat les balises et le contenu du compteur d'articles, du 
								#titre et de la description
								if (!(exists  $dico2{$ligne})) 
									{
								    $dico2{$ligne} = 1;
								    print OUT3 "$ligne\n";
									}
							

								}
							} 

						}
					#fermeture des fichiers
					print OUT3 "\n*************************************************************\n";
					close FIC2;
				close OUT3;
				}
       
			}
		}
	}
#----------------END-Definition-Fonction---------------