La boîte à outils 1, le commencement

L'objectif de la première boîte à outils était le suivant : à partir des archives RSS du site du Monde (collectées depuis un certain temps par SF), extraire le contenu textuels de chaque fil (titre et description) suivant les rubriques (International, A la une, France, etc).

Avec une expression régulière

Le programme est téléchargeable ici et s'organise ainsi :

  • On récupère auprès de l'utilisateur le nom du répertoire contenant les archives.
  • On créée deux tableaux associatifs : une première qui stockera les noms des rubriques, et une seconde qui contiendra les items (le contenu).
  • On lance un premier parcours avec le sous-programme "parcoursrubriques" :
    • parcoursrubrique inspecte chaque objet qu'il trouve et poursuit sa progression tant qu'il ne tombe pas sur un fichier xml (et pas un répertoire)
    • Il appelle le sous-programme de nettoyage des fins de ligne (suppression des lignes vides notamment).
    • On récupère l'encodage, et s'il est connu, on poursuit le traitement. Si on ne le trouve pas ou qu'il est inconnu, on abandonne.
    • On récupère alors le nom de la rubrique grâce à l'expression régulière ~ /<channel><\title>([^>]+)<\/title>/,

      et on formate ce nom pour le passer en majuscules et le débarrasser de ses caractères accentués.
    • On insère le nom récupéré dans la table de hashage des rubriques.
  • On repasse alors dans le programme principal : on transfère les valeurs stockées dans le tableau associatif dans un tableau de valeurs qui contient donc l'ensemble des noms de rubriques récupérés.
  • Pour chacune de ces rubriques, on génère un fichier XML et un fichier texte où l'on inscrira les résultats de l'extraction. Pour le fichier XML, on n'oublie pas d'inscrire l'en-tête XML ainsi que la balise racine, intitulée de façon très originale <PARCOURS>.
  • On lance à ce moment un nouveau sous-programme, "parcoursfichiers" :
    • parcoursfichiers fonctionne globalement sur la même structure que parcoursrubriques. Les deux sous-programmes diffèrent dans la recherche et l'extraction des contenus.
    • Le programme progresse dans l'arborescence, recherche l'encodage et repère le nom des rubriques
    • Pour le fichier XML, on effectue plusieurs traitements préalables : on inscrit plusieurs balises en tête comme <file>, <name>. On recherche et récupère également la date.
    • Puis, après avoir ouvert les fichiers de sortie générés, on recherche la suite suivante dans les fichiers RSS : <item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>, ce qui permet de récupérer les contenus des balises titre et description.
    • Après un petit nettoyage et réencodage, on vérifie que le résumé n'apparaît pas déjà dans le dictionnaire des items. Si ce n'est pas le cas, on le traite : d'une part on écrit le titre et le résumé dans la variable texte, d'autre part, on insère les contenus dans des balises XML. Et on avance dans le dictionnaire des items.
    • En revanche, si le contenu a déjà été traité, on ne fait rien pour la version texte, et dans la version XML on écrit les balises avec un simple tiret à l'intérieur.
    • Enfin, on ferme les balises <file> et <name>, et on inscrit le contenu des variables temporaires dans les fichiers de sorties.
  • De retour une fois de plus dans le programme principal, il suffit maintenant, dans chaque fichier de sortie en XML, de fermer la balise racine <PARCOURS>

Et voila ! Simple comme bonjour n'est-ce-pas ?
Pour avoir un idée un peu plus précise du résultat obtenu, vous pouvez voir un échantillon des résultats sur la rubrique "A la une" : pour la version texte ici

et pour la version XML ici.

Les avantages de cette façon de faire

Il y en a surtout un : les noms des rubriques sont automatiquement détectés, ce qui assure une certaine portabilité au programme.

Avec des modules

Le script est téléchargeable ici.

Une autre façon de faire consiste à utiliser le module Perl XML::RSS. Plutôt que de le télécharger en ligne, nous avons eu recours au gestionnaire de paquets Synaptic pour l'installer.
XML::RSS est un module très pratique pour ce que nous cherchons à faire puisqu'il connait l'architecture XML. On peut donc lui demander d'aller chercher directement ce que l'on cherche.

Le point important du script est le suivant :

Il se trouve juste après l'endroit où l'on détermine si le fichier examiné est un fichier XML. Les contenus des balises "title" et "description" sont sauvegardés dans des variables, qui sont ensuite traitées de façon similaire au traitement du premier script.
Le point noir est le fait que nous n'avons pas réussi à maintenir l'extraction du nom des rubriques, donc les fichiers de sortie valent pour l'ensemble du répertoire traité.
Un extrait des fichiers de sortie sont disponibles à ces adresses : texte et XML (agrémenté d'un petit fichier XSLT pour plus de lisibilité).

Les avantages de cette façon de faire

Le programme se raccourcit sensiblement et l'on s'épargne les longues et innombrables expressions régulières qui sont propices aux erreurs.