Objectif
         Extraire le contenu textuel des fils rss du journal le Monde sur une année.

Donner des arguments en entrée

Pour lancer ce script, nous donnons deux arguments en entrée : le nom du répertoire (2015) et le nom de la rubrique (voir plus loin).

Les arguments donnés en ligne de commande sont passés dans un tableau @ARGV. Pour les récupérer, nous utilisons donc leurs indices ($ARGV[i]) dans notre script.

Déclarer les fichiers de sortie

On veut un fichier de sortie au format xml et un fichier de sortie au format txt pour la surface et la profondeur (voir plus loin), soit 4 fichiers de sortie par rubrique.

On les initialise tous au début de notre script (on utilise des descripteurs de fichier explicites pour ne pas se perdre) :

Parcourir une année de données

Voici l'arborescence sur laquelle on doit travailler.

Le répertoire d'une année contient 12 sous-dossiers :
Ces 12 dossiers contiennent chacun de 28 à 31 sous-dossiers :
Ces 28 à 31 dossiers contiennent chacun un dossier dont le nom est de la forme 19-00-00 :
Ce dossier contient les fichiers qui nous intéressent :

Le fichier dont le nom est de la forme 0,2-3208,1-0,0.xml contient ce qu'on appelle la surface : le titre et la description de chaque article pour une rubrique donnée.

Le fichier dont le nom est de la forme 0,2-3208,1-0,0.txt contient ce qu'on appelle la profondeur : les articles entiers pour une rubrique donnée.

Les noms de rubriques correspondent aux chiffres utilisés dans les noms des fichiers. On déclare leurs équivalents dans une table de hachage au début de notre script pour pouvoir utiliser un nom de rubrique explicite dans nos fichiers de sortie.

Chaque fois qu'un fichier d'une journée est traité, il faut pouvoir à nouveau parcourir l'arborescence et traiter le fichier de la journée suivante et ainsi de suite sur toute l'année. Pour faire cela, on va utiliser ce qu'on appelle une procédure en Perl. Comme une procédure peut s'appeler elle-même, cela va permettre la récursion.

Extraction de la surface

Voici un extrait du fichier xml dont on veut extraire la surface :

On voit que le fichier en question ne compte en réalité que 2 lignes. On va supprimer les retours à la ligne (\r), et mettre tout le texte sur une seule ligne pour pouvoir extraire le contenu qui nous intéresse à l'aide d'expressions régulières. On s'assure également qu'il n'y ait pas de caractère d'espacement (\s) entre une balise fermante et la balise ouvrante qui suit.

Méthode 1 : expressions régulières

Perl permet de récupérer la chaîne reconnue par une expression régulière en utilisant des variables temporaires ($1, $2,... en fonction de la position de la parenthèse capturante du motif), c'est ce qu'on utilise pour récupérer les titres et descriptions.

Méthode 2 : bibliothèque XML::RSS

Il existe déjà des modules Perl pour traiter les fils RSS, on va en utiliser un : XML::RSS.

On doit d'abord installer le module, cela ne présente aucune difficulté sous ubuntu (ligne de commande -> sudo cpan XML::RSS).

Au début du script, on précise qu'on va faire appel à un module extérieur avec la ligne use XML::RSS. Puis on déclare un nouvel objet RSS qui représente le fil RSS à traiter.

Le principe est simple :

Extraction de la profondeur

Voici un extrait du fichier txt dont on veut extraire la profondeur :

Il n'y a pas de balise fermante dans le fichier mais nous pouvons tout de même utiliser une stratégie d'extraction similaire à celle utilisée pour la surface. Ici aussi on ramène tout le texte sur une même ligne puis on récupère le motif recherché (qui correspond à un article) dans une variable temporaire.

Par contre, le contenu récupéré est parsemé de caractères et d'expressions indésirables. On crée donc une procédure qui va les supprimer à l'aide d'expressions régulières et va retourner le texte nettoyé. En voici un extrait :

Scripts

Télécharger le script qui utilise la méthode 1.

Télécharger le script qui utilise la méthode 2.

Fichiers obtenus pour la profondeur :
rubrique Culture (txt)
rubrique Culture(xml)
rubrique International (txt)
rubrique International (xml)

Fichiers obtenus pour la surface (pour les fichiers de sortie xml, voir la bao2) :
rubrique Culture (xml)
rubrique International (xml)
rubrique Culture (txt)
rubrique International (txt)