Boîte à Outil 1

Parcours du répertoire arborescent, extraction du texte

Idée principale

RSS (« Really Simple Syndication ») est un des applications de XML, qui est généré automatiquement et régulièrement pendant la mise à jour d’un site web. Il comporte les titres et les résumés des dernières infos, qui nous permet de suivre les nouvelles d’un site. Ici, on utilise l’ensemble des fils RSS de l’an 2019, recueilli par M. Fleury, comme notre corpus de travail.

La première méthode n’utilise que Perl et le RegExp. On trouve que les titres et leur description suivent l’élément « item ». Après avoir récupérer le contenu entre deux balises, on fait un petit nettoyage.

Néanmoins, pour que le script puisse traiter tous les fichiers en lançant une seule fois, on doit aussi utiliser l’idée de récursivité, qui nous permet de parcourir le corpus arborescent.

Dans mon script, à part le corps principal, j’ai créé trois sous-fonctions : la première sert à parcourir le corpus et trouver les fichiers RSS de la rubrique demandée; la 2e sert à extraire le texte; la 3e est pour le nettoyage.

Script

4 rubriques sont traitées par ce script : "À la une"(3208), "International"(3210), "Economie"(3234) et "Technologies"(651865). Voici le script et les résultats.

#usr/bin/perl -w
<<DOC; 
Votre Nom : Jianying LIU
JANVIER 2020
 usage : perl BaO1.pl repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire-racine contenant les fichiers
 à traiter et le nom de la rubrique à traiter parmi ces fichiers
DOC
use strict;
use utf8;

#indiquer l'encodage de sortie dans le console
binmode(STDOUT, ":utf8");

my $rep = $ARGV[0];       #?guillemets?
$rep =~ s/[\/]$//;          #[\/] choisir entre deux
my $rubrique = $ARGV[1];


#programme principal

#ouvrir le fichier txt et le fichier xml pour l'écriture
open(TXT, ">:encoding(utf8)", "sortie_$rubrique.txt");
open(XML, ">:encoding(utf8)", "sortiexml_$rubrique.xml");
print XML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus 2019>\n";    #écrire la tête du fichier xml

my $i = 1;      #compteur pour le calcul total de fichiers rss traités
my $count_item = 1;
my %dico_titres = ();
&parcoursArbFic($rep);

print XML "</corpus 2019>\n";
close TXT;
close XML;
exit;


###############################################

sub parcoursArbFic {
	my $path = shift(@_);    #shift obligatoire
	my @files = <$path/*>;  #cette opération renvoie la liste des fichiers/répertoire dans ce répertoire, sans . et .. (donc pas besoin de tester et sauter), ordonné, avec chemin complet (donc pas besoin de concaténation pour obtenir le path
	foreach my $file (@files) {
		#if rep. recursif
		if (-d $file) {
			&parcoursArbFic($file);
		}
		#if file : open, chercher motif, ecrire   sous-fonction
		if (-f $file and $file =~ /$rubrique.+xml$/) {
			print $i++," Traitement de : ",$file,"\n";
			&ecritureFic($file);
		}
	}	
}

#traitement sur un fichier rss cherché
sub ecritureFic{
	#ouvrir le fichier RSS
	my $fichier = shift(@_);
	open(RSS, "<:encoding(utf8)", $fichier);
	#lecture global du fichier
	$/ = undef;
	my $textelu = <RSS>;
	close RSS;
	
	#chercher motif avec RegExp
	while ($textelu =~ /<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg){  #m multiple lines, on peut matcher plusieurs lignes,influencer ^ et $; s influence . qui peut matcher aussi \n maintenant
		my $titre = $1;
		my $description = $2;
		#tester si ce titre existe déjà dans le dico_titre
		if (! (exists $dico_titres{$titre})){   #!布尔值取反 存在 --> 不存在; exists fonctionne sur les clés
			$dico_titres{$titre} = $description;
			($titre, $description) = &nettoyage($titre,$description);  #sans paranthèses, on n'arrive pas à ajouter le point à la fin de chaque titre, mais pourquoi??
			
			#écrire le contenu dans deux fichiers
			print TXT "$titre\n$description\n--------------------\n";
			print XML "<item numero=\"$count_item\">\n<titre>$titre<\/titre>\n<description>$description<\/description>\n<\/item>\n";   #slash可以转义也可不转
			$count_item++;
		}
	}
}


#nettoyer le contenu extrait du rss avec une sous-fonction
sub nettoyage {
	my $titre = $_[0];
	my $description = $_[1];
	$titre=~s/^<!\[CDATA\[//; ##
	$titre=~s/\]\]>$//;       ##
	$description=~s/^<!\[CDATA\[//;  ##
	$description=~s/\]\]>$//;  ##
	$description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
	$description=~s/ +/ /g;   #supprimer les espaces abondantes successifs; le nettoyage manquant?
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/([^?\.])$/$1\./g;         #?ajouter un point à la fin de chaque titre####
    return $titre,$description;
}

boîte à outils 3

Récupération des patrons morphosyntaxiques

Savoir plus