Accueil | BàO 1 | BàO 2 | BàO 3 | BàO 4 | Conclusion

Au cours de cette BàO, nous avons extrait les données textuelles des fils RSS du journal Le Monde. J'ai choisi les rubriques: "Médias" "Livres" et "Idées".

Pour ce faire, nous avons écrit un programme en langage de programmation Perl. Le programme entre tout d'abord dans le répertoire de l'année 2018, puis va entrer dans le répertoire de chaque mois, et dans le répertoire de chaque jour, pour finalement entrer dans les fichiers présents dans ces répertoires. Une fois entré dans un fichier, nous allons récupérer seulement les données textuelles, c'est à dire retirer toutes les balises HTML et le texte "poubelle", en même temps, nous allons mettre les titres de ces fils RSS dans une variable nommée $titre ($titrenettoye une fois les balises retirées) et faire la même chose pour les descriptions. Ensuite, ces variables vont être affichées normalement dans un fichier texte, et encadrées par des balises xml pour le fichier xml.

Voici donc les deux programmes utilisés: le premier consiste à extraire les données textuelles à l'aide des expressions régulières, et du langage de programmation Perl:



	#/usr/bin/perl
	<<DOC; 
	 Février 2019
	 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
	 Le programme prend en entrée le nom du répertoire contenant les fichiers
	 à traiter et le nom de la rubrique à traiter (via une suite de chiffres)
	 Le programme construit en sortie 2 fichiers :
	 - un fichier TXT
	 - un fichier structuré en XML 
	 Les 2 fichiers contiennent les zones textuelles extraites des fils RSS
	DOC
	#-----------------------------------------------------------
	my $rep="$ARGV[0]";
	my $rubrique="$ARGV[1]";
	# on s'assure que le nom du répertoire ne se termine pas par un "/"
	$rep=~ s/[\/]$//;
	my $i=0;
	my %doublons;
	open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-regexp.txt");
	open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-regexp.xml");
	print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
	print OUTXML "<racine>\n";

	#----------------------------------------
	&parcoursarborescencefichiers($rep);	#recursion
	close OUT;
	print OUTXML "</racine>\n";
	close OUTXML;
	exit;
	#----------------------------------------------
	sub parcoursarborescencefichiers {
		my $path = shift(@_);
		opendir(DIR, $path) or die "can't open $path: $!\n";
		my @files = readdir(DIR);
		closedir(DIR);
		foreach my $file (@files) {
			next if $file =~ /^\.\.?$/;
			$file = $path."/".$file;
			if (-d $file) {
				print "on entre dans $file \n";
				&parcoursarborescencefichiers($file);	#recurse!
			}
			if (-f $file) {
				if ($file=~/$rubrique.+\.xml$/) {			
					print $i++," : $file \n";
					open(FIC, "<:encoding(utf-8)", $file);
					my $tout_le_texte="";
					while (my $ligne = <FIC>) {
						chomp $ligne;
						$tout_le_texte = $tout_le_texte . $ligne . " ";
					}
					close FIC;
					while ($tout_le_texte =~ /<item>.*?<title>([^<]*)<title>.*?<description>([^<]*)<\/description>.*?<\/item>/g) {
						my $titre = $1;
						my $description = $2;
						my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);
						if (exists $doublons{$titrenettoye}) {
							$doublons{$titrenettoye}++;
						}
						else {
							$doublons{$titrenettoye}=1;
							print OUT "$titrenettoye\n";
							print OUT "$descriptionnettoye\n";
							print OUTXML "<article>\n";
							print OUTXML "<titre>$titrenettoye</titre>\n";
							print OUTXML "<description>$descriptionnettoye</description>\n";
							print OUTXML "</article>\n";
						}
					}
				}
			}
		}
	}

	sub nettoyage {

	my $var = $_[0]; #my ($tit, $des) = @_;
	my $var1 = $_[1];

	$var = $var . "." ; # $var .= ".";
	#$var1 = $var1 . ".";
	$var1 =~ s/&#39;/'/g;
	return $var, $var1;
	}

	#----------------------------------------------


			

Ce programme-ci consiste à extraire les données textuelles à l'aide de Perl et du module XML::RSS, qu'il faut au préalable installer sur le bash Ubuntu (ce que j'ai utilisé personnellement)


	
	#/usr/bin/perl
#-----------------------------------------------------------
<<DOC; 
 Février 2019
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter et le nom de la rubrique à traiter (via une suite de chiffres)
 Le programme construit en sortie 2 fichiers :
 - un fichier TXT
 - un fichier structuré en XML 
 Les 2 fichiers contiennent les zones textuelles extraites des fils RSS
DOC
#-----------------------------------------------------------
use XML::RSS;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
my $i=0;
my %doublons;
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-xmlrss.txt");
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-xmlrss.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";

#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
close OUT;
print OUTXML "</racine>\n";
close OUTXML;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
		    print "on entre dans $file \n";
			&parcoursarborescencefichiers($file);	#recurse!
		}
		if (-f $file) {
		    if ($file=~/$rubrique.+\.xml$/) {			
				print $i++," : $file \n";
				my $rss=new XML::RSS;
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;               # remove module line number
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					foreach my $item (@{$rss->{'items'}}) {
						my $description=$item->{'description'};
						my $titre=$item->{'title'};
						my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);
						if (exists $doublons{$titrenettoye}) {
							$doublons{$titrenettoye}++;
						}
						else {
							$doublons{$titrenettoye}=1;
							print OUT "$titrenettoye\n";
							print OUT "$descriptionnettoye\n";
							print OUTXML "<article>\n";
							print OUTXML "<titre>$titrenettoye</titre>\n";
							print OUTXML "<description>$descriptionnettoye</description>\n";
							print OUTXML "</article>\n";
						}
					}
				}
						
			}
		}
    }
}

sub nettoyage {

my $var = $_[0]; #my ($tit, $des) = @_;
my $var1 = $_[1];

$var = $var . "." ; # $var .= ".";
#$var1 = $var1 . ".";
$var1 =~ s/&#39;/'/g;
return $var, $var1;
}

#----------------------------------------------

			

Nous obtenons donc quatre documents pour chaque rubrique, deux documents texte et deux documents avec des balises XML :

SORTIES TXT :

Pour chaque rubrique il y a deux documents textes, un pour la sortie textuelle obtenue grâce aux expressions régulières, l'autre grâce au module XML::RSS

Pour télécharger les fichiers: ici (sous forme d'archive)

SORTIES XML :

Pour chaque rubrique, il y a deux documents XML, constitué de balises titres et description, obtenus grâce aux expressions régulières, l'autre grâce au module XML::RSS

Pour télécharger les fichiers: ici (sous forme d'archive)