Boîte à Outils n°1
La première étape de ce projet a pour but d'extraire les titres et les descriptions contenus dans chaque fichier XML de l'arborescence.
Cette tâche s'effectue via un script perl, deux méthodes étant à notre disposition : la première en utilisant des expressions régulières, et la seconde via le module Perl XML::RSS.
1. Méthode REGEX
(Télécharger le programme bao1_regex.pl)
Le programme contient plusieurs sous-programmes : un pour parcourir l'arborescence et effectuer les traitements, un second pour repérer les noms des rubriques, et un autre servant à "nettoyer" les titres et les descriptions. Le programme aura donc la structure suivante :
Commençons tout d'abord par la fonction parcoursarborescencefichiers :
Le parcours d'arborescence se fait avec des conditions : on utilise 'if (-d $file)' pour identifier les dossiers, et 'id (-f $file)' pour les fichiers.
On commence ensuite le traitement si le fichier trouvé se termine par ".xml", et s'il ne commence pas par "fil" (autres fichiers faisant partie de l'arborescence, qui ne nous intéressent pas) :
Une autre condition nécessaire au traitement est l'identification de l'encodage, via l'expression :
On récupère l'encodage via la commande my $encodage=$1; où $1 désigne le contenu des parenthèses. Si la variable $encodage n'est pas vide, on continue le traitement (écriture des balises dans les sorties xml et nettoyage) :
Vient ensuite la détection des rubriques :
Les noms des rubriques se situent entre les balises title, suivant directement la balise <channel>. Or, dans certains cas, une balise <atom> suit la balise <channel>, ce qui a créé des problèmes lors de ma première tentative en utilisant simplement l'expression : /<channel><title>([^<]+)<\/title>/. J'ai donc intégré cette information via la disjonction [<channel>|<atom.+>], ce qui a résolu le problème.
Comme vu précédemment, la récupération de la rubrique se fait avec la variable $1, que l'on normalise (en supprimant les accents et les informations en trop) et met en majuscules. J'ai ici choisi d'utiliser les codes de caractères Unicode \x{...} pour identifier les lettres accentuées.
On passe ensuite à la détection des titres et descriptions, que l'on stocke dans des variables pour effectuer plusieurs traitements :
Le premier traitement se fait ici avec le module Unicode::String qw(utf8) permettant d'encoder des chaînes en UTF-8. Ensuite, un second module, HTML::Entities, est utilisé pour convertir les caractères en entités HTML afin d'éviter des problèmes de codage lors de la création des nouveaux fichiers.
La fonction clean appelée ici permet de supprimer les balises non pertinentes intégrées aux titres et descriptions, ainsi qu'à filtrer certains caractères restants posant problème.
La fonction clean

Enfin, après s'être chargé de stocker et de traiter les titres et descriptions, il faut s'assurer de ne pas les extraire plusieurs fois. Pour éviter les doublons, une méthode consiste à placer les titres et descriptions rencontrés dans des tables de hashage et d'ajouter une condition : si le titre ou la description ne se trouvent pas déjà dans les tables, alors on les extrait. On commence donc par initialiser les tables au début du programme (juste avant l'utilisation de la fonction repererubriques) :
my %dicoDESC=();
Puis à ajouter la condition après l'étape de nettoyage ci-dessus :
La fonction repererubriques conserve la même structure que parcoursarborescencefichiers : on commence par parcourir l'arborescence avec les commandes if (-d $file) et if (-f $file), on recherche l'encodage et supprime les sauts de lignes puis on repère les rubriques. Par contre, on ajoute en plus une table de hashage au début du programme (my %dicoRUB=();) pour mémoriser les noms de rubriques :

2. Méthode XML::RSS
(Télécharger le programme bao1_RSS.pl)
L'utilisation de XML::RSS ne change pas la configuration du programme précédent : il suffit simplement de remplacer la recherche des titres et descriptions via les expressions régulières par les commandes prévues par le module, comme suit :
Début de la boucle avec regex :
Début de la boucle avec module RSS :
L'utilisation du module a l'avantage de pouvoir se déplacer directement à l'intérieur de l'arborescence des fichiers xml, l'objet RSS créé à la première ligne permettant d'associer des références à des clés. On obtient donc un tableau associatif liant des noeuds entre eux, dans ce cas précis le noeud 'item' associé aux noeuds 'title' et 'description' grâce à l'opérateur '->'.
Les deux méthodes donnent au final les mêmes résultats, que nous allons voir maintenant. A noter que la méthode par XML::RSS prend plus de temps que celle par expressions régulières.
Résultats
Exemple de résultat XML : SPORT.xml
Exemple de résultat TXT : SPORT.txt