Objectifs de la Bao1 :



L'objectif de la première boîte à outils est d'extraire les contenus textuels de tous les titres et de toutes les descriptions de l'année 2021 pour une rubrique donnée. Nous traiterons quatre rubriques tout au long du projet : la rubrique "Culture", la rubrique "Europe", la rubrique "Société et la rubrique "Cinéma".

Ci-dessous, le tableau des correspondances entre les numéros des fichiers XML et les rubriques auxquelles ils correspondent :


Concept notoire : La récursivité


Cette BAO présente un intérêt pour les débutants en programmation que nous sommes puisqu'elle exploite la notion de récursivité. Les programmes parcourent une arborescence de dossiers jusqu'à rencontrer un fichier XML correspondant au fil RSS de la rubrique renseignée par l'utilisateur. Ce parcours prend la forme d'une fonction récursive, qui est relancée tant que l'on rencontre des dossiers, jusqu'à la "découverte" dudit fichier.

SCRIPT PERL



EXPLICATION DU SCRIPT PERL


Ajout personnel : créer une arborescence pour s'y retrouver


Etant donné la quantité de fichiers produits et les différents langages manipulés durant ce projet, j'ai jugé utile de distinguer les fichiers par rubriques et par langages de programmation. J'ai fait en sorte que la création d'arborescence soit automatisée au lancement des scripts.


J'ai donné plus de liberté à l'utilisateur quant au choix des noms des fichiers de sortie que dans le script original. On vérifie d'abord que l'utilisateur donne bien 3 arguments au programme. Le premier argument (à l'indice 0) est le répertoire qui contient tous les flux rss et dont nous allons parcourir l'arborescence. Le second argument (à l'indice 1) est le numéro de la rubrique dont on veut extraire les titres et les descriptions. Les deux arguments suivants sont les fichiers de sortie xml et txt dont on choisit les noms. On créé au lancement du programme un dossier PERL pour distinguer les fichiers de sortie de ceux qui seront générés en python.

Une suite de conditions "if" détermine le nom du dossier dans lequel se rangeront les fichiers issus de l'extraction (via un jeu de correspondances numéro de rubrique/thématique de la rubrique). Ce dossier nommé d'après la rubrique est contenu dans le dossier PERL.

Ouverture des fichiers et appel à la fonction de parcours


On supprime l'éventuel slash qu'un utilsateur distrait aurait placé à la fin du nom de son répertoire. On procède ensuite à l'ouverture des deux dossiers de sortie (txt et xml) dans le dossier de sortie. On écrit l'en-tête xml dans le fichier xml. On lance ensuite la fonction qui parcourt l'arborescence et dont nous expliquons le fonctionnement ci-bas. Une fois le parcours terminé, on écrit la balise de clôture du fichier XML et on ferme les dossiers.

Le coeur du script : la fonction récursive de parcours de l'arborescence


Il s'agit de la fonction au coeur de la BAO1. La fonction parcoursarborescencefichiers récupère comme argument (via un shift) le premier que l'on a donné au lancement du programme : le dossier qui contient toute l'arborescence et les flux RSS du monde pour l'année 2021. On définit dans un premier temps le chemin comme étant celui menant au répertoire et on l'ouvre. On lit ensuite son contenu.


En lisant le contenu de ce répertoire, on s'assure dans un premier temps que les éventuels répertoires cachés qui s'y trouveraient ne seront pas pris en compte en "passant" (via next) si le nom du répertoire commence par deux points. Dans le cas canonique où les répertoires ne sont pas des répertoires cachés, pour chacun des répertoires que l'on rencontre, on l'ajoute au chemin précédemment instancié.



La fonction se scinde ensuite en deux conditions "if". Si les éléments que l'on a ajoutés au chemin sont des dossiers, on relance l'opération sur ces dossiers. C'est en cela que la fonction est récursive, puisque l'on applique la fonction à elle-même tant que l'on rencontre des dossiers. La condition de sortie de cette boucle récursive tient dans la seconde condition "if" de la fonction : si l'élément ajouté au chemin est un fichier, si le fichier contient le numéro de la rubrique que l'utilisateur a choisi et est un fichier xml, alors on l'ouvre en lecture et on en lit les lignes.


Pour chaque ligne du fichier, on repère les lignes correspondant au balisage xml des titres et des descriptions et on isole le contenu textuel via des groupes de capture. On nettoie les titres et description que l'on vient d'extraire via un appel à la fonction ad hoc et on les envoie vers nos fichiers de sortie (en prenant bien soin d'insérer les titres et les descriptions dans des balises pour le fichier xml).

La fonction de nettoyage


La fonction de nettoyage ne garde que le contenu textuel des lignes, on supprime les caractères CDATA ou les deux points finaux pour ne récupérer que le texte propre.

Les titres et les descriptions sont ensuite concaténés dans deux fichiers distincts : un fichier XML dans lequel les titres et les descriptions sont contenus dans des balises explicites et un fichier texte contenant les titres et les descriptions au format texte brut.


ex. titres et descriptions concaténés au format TXT pour la rubrique "Europe"


ex. titres et descriptions concaténés au format XML pour la rubrique "Europe"

SCRIPT PYTHON




EXPLICATION DU SCRIPT PYTHON


Lors de la première BAO1, il nous a été chaudement conseillé de tenter de produire notre propre version du script python du parcours de l'arborescence. Le script détaillé ci-bas est donc un script personnel et non pas celui programmé par monsieur Pierre Magistry. Ce script est une traduction plus ou moins fidèle de la logique du script PERL.


Ajout personnel : créer une arborescence pour s'y retrouver

Comme pour le script PERL, on crée une arborescence de dossiers qui classe les fichiers selon le langage (python dans le cas qui nous occupe) et selon la rubrique choisie.



Là encore, le premier argument est le répertoire contenant l'arborescence des flux RSS, le second est le numéro de la rubrique et les deux suivants sont les fichiers xml et txt de sortie. On retrouve également les conditions déterminant les correspondances entre numéro de la rubrique et thématique traitée.

Ouverture des fichiers



On ouvre ensuite les fichiers que l'utilisateur a donné en argument au programme. On s'attend à ce que l'utilisateur donne 2021 comme dossier à parcourir. On modifie le chemin en remontant deux parents auparavant de sorte à rencontrer le dossier 2021, situé plus haut dans notre arborescence de travail.

Le coeur du script : la fonction récursive de parcours de l'arborescence


On calque le déroulement de la fonction PERL en l'adaptant à la grammaire de python. On ouvre le dossier contenant toute l'arborescence, on lit son contenu (via os.listdir) et pour chacun des éléments lus, le chemin est redéfinit en ajoutant l'élément. Si l'élément est un dossier, on relance la fonction sur le dossier. S'il s'agit d'un fichier, on fait appel à la fonction extract_un_fil.

La fonction extract_un_fil


On exploite le module re qui permet de manipuler les regex en python. On constate que le langage PERL est beaucoup plus pratique et maniable dès lors qu'il s'agit d'exploiter les expressions régulières, qui sont naturellement intégrées au langage. On recherche alors toutes les lignes contennant les balises titres et description. Si on en trouve, on ouvre le fichier en lecture, on lit ses lignes et pour chaque ligne contenant les balises, on nettoie la ligne en ne gardant que le contenu textuel des lignes et des descriptions via la fonction nettoyage appliquée aux groupes de captures de la regex.

La fonction de nettoyage



La fonction de nettoyage reprend le même principe que pour le script PERL.

RESULTATS - FICHIERS DE SORTIE