C'est ici que tout commence !
En effet, dans la Boîte à Outils 1, nous allons tester la structure qui formera le "squelette" des programmes que nous vous présenterons.
Ici, nous procéderons au parcours d'une arborescence de fichiers ; puis, nous traiterons certains d'entre eux de façon à fournir en sortie uniquement le contenu important.
En entrée, nous aurons donc une arborescence de fichiers qui sont regroupés par répertoires. La BàO1 doit parcourir tous ces fichiers et trouver ceux qui sont les vrais fils RSS, en extaire les données textuelles et les enregistrer.
En sortie, nous allons créer deux fichiers : l'un en format texte brut et l'autre en format xml dans lequel le contenu sera structuré par des balises xml.
- Parcourir de manière récursive
On récupère le nom du répertoire donné par l'utilisateur et on lance notre fonction de parcours :
my $rep="$ARGV[0]";
$rep=~ s/[\/]$//;
&parcoursarborescencefichiers($rep);
La fonction ouvre ce répertoire et en vérifie le contenu.
- Si elle y trouve un autre répertoire, elle l'ouvre, le lit, ...infiniement
- Si elle y repère est un fichier (de plus si c'est un fichier xml) elle le traite :
sub parcoursarborescencefichiers {
#La variable prédéfinie de Perl @_ stocke les arguments passés à la fonction
#On récupère le seul argument contenu dans cette liste grâce à la fonction shift()
my $path = shift(@_);
opendir(DIR, $path) or die "can't open $path: $!\n";
#La liste @files contient ce qu'on trouve dans le répertoire
my @files = readdir(DIR);
closedir(DIR);
#On teste chaque élément de cette liste
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
#Si c'est un dossier : on le parcourt de façon récursive
if (-d $file) {
&parcoursarborescencefichiers($file); }
#Si c'est un fichier : on extrait le contenu
if (-f $file) {
#Ce traitement ne s'applique qu'aux fichiers xml
if ($file=~/\.xml$/) {
print $i++,"\n";
- Extraire de l'information utile
C'est ici que l'on va faire appel à nos deux méthodes différentes.
Si on applique la première méthode, celle des expressions regulières, on lit le fichier ligne par ligne...
while (my $ligne=<FILEIN>){
chomp($ligne);
$ligne=~ s/> *</></g;
$texte.=$ligne;
}
...on répère les données de publication...
$texte=~/<channel>.+?<pubDate>(.+?)<\/pubDate>/;
my $donnees=$1;
...et on lance la boucle WHILE pour trouver tous les articles (items) du fichier ainsi que leur titre et leur contenu :
while ($texte=~/<item>.+?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g)
{
my $titre=$1;
my $description=$2;
La deuxième méthode implique l'utilisation de la bibliothèque XML::RSS. Pour que cela soit possible, nous l'avons téléchargée puis installée au préalable :
On crée un nouvel objet de la bibliothèque, puis on utilise les méthodes de cette dernière, dans le but de récupérer les données du fichier.
La logique est la suivante : un seul 'pas' pour répérer les données de publication suivi d'une boucle pour traiter tous les articles :
#Dans la variable $rss, on stocke les résultats du parsing du fil RSS
$rss->parsefile($file);
#On définit le chemin vers le noeud PubDate
my $donnees=$rss->{'channel'}->{'pubDate'};
#Pour chaque element "item" on récupere le titre et la description
foreach my $item (@{$rss->{'items'}}) {
my $titre=$item->{'title'};
my $description=$item->{'description'};
- Traiter les données
Avant d'enregistrer les données, l'on a vérifié leur encodage et on les a converti en utf-8 dans le cas où l'encodage initial était différent :
my $encodage=`file -i $file | cut -d= -f2`;
#...
if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($description);}
On les a nettoyé :
$titre=&nettoieText($titre);
$description=&nettoieText($description);
#...
sub nettoieText {
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/&#39;/'/g;
$texte=~s/&#34;/"/g;
$texte=~s/]]>//g;
return $texte;
}
Et on a vérifié si ces données étaient uniques afin d'éviter les doublons.
#On détecte les doublons entre les titres et les contenus des articles
#Si c'est nouveau, on l'ajoute
if (!(exists($titleDic{$titre}))) {
$DUMPFULL_XML.="<abstract>$titre</abstract>";
$DUMPFULL_TXT.=$titre."\n";
$titleDic{$titre}++;
}
#Sinon, on remplace par un vide
else {
$titleDic{$titre}++;
$DUMPFULL_XML.="<abstract>-</abstract>\n";}
- Enregistrer la sortie
Il ne reste qu'à ouvrir les fichiers de sortie xml et txt...
open (FILEOUT_XML,">:encoding($encodagesortiexml)","sort1.1.xml") or die "pb ouverture fichier $!";
open (FILEOUT_TXT,">:encoding($encodagesortietxt)","sort1.1.txt") or die "pb ouverture fichier $!";
...et à afficher les deux variables qui stockent toutes nos données :
print FILEOUT_XML "<?xml version=\"1.0\" encoding=\"$encodagesortiexml\" ?>\n";
print FILEOUT_XML "<PARCOURS>\n";
print FILEOUT_XML "<NOM>Denis, Nadel</NOM>\n";
print FILEOUT_XML "<FILTRAGE>".$DUMPFULL_XML."</FILTRAGE>\n";
print FILEOUT_XML "</PARCOURS>\n";
#On ferme
close(FILEOUT_XML);
print FILEOUT_TXT $DUMPFULL_TXT;
close(FILEOUT_TXT);
Voilà, la BàO1 est finie !!!
=> Pour télécharger les scripts en intégralité avec les commentaires, cliquezici et ici.