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.

  • Objectifs
  • - parcourir l'arborescence des fichiers RSS donné par l'utilisateur
    - extraire le contenu des balises "title" et "description" de chaque article de ces fichiers
    - filtrer leur contenu
    - enregistrer les données extraites en formats txt et xml

  • Qu'y a-t'il dans la boîte ?
  • Pour extraire les données textuelles des fils RSS, nous allons tester deux outils :

  1. le module standard Perl des expressions régulières
  2. la bibliothèque Perl XML::RSS
  • Comment faire ?
  1. Parcourir de manière récursive
  2. 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";
    

  3. Extraire de l'information utile
  4. 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 :

    use XML::RSS;
    

    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'};
    

  5. Traiter les données
  6. 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/&lt;/</g;
        $texte =~ s/&gt;/>/g;
        $texte =~ s/<a href[^>]+>//g;
        $texte =~ s/<img[^>]+>//g;
        $texte =~ s/<\/a>//g;
        $texte =~ s/&#38;#39;/'/g;
        $texte =~ s/&#38;#34;/"/g;
        $texte =~ s/&#233;/é/g;
        $texte =~ s/&#234;/ê/g;
        $texte =~ s/<[^>]+>//g;
        $texte =~ s/&nbsp;/ /g;
        $texte=~s/&#39;/'/g;
        $texte=~s/&#34;/"/g;
        $texte=~s/&amp;#39;/'/g;
        $texte=~s/&amp;#34;/"/g;
        $texte=~s/]]>//g;
        return $texte;
    }
    

    Et on a vérifié si ces données étaient uniques afin d'éviter les doublons.

    $DUMPFULL_TXT et $DUMPFULL_XML sont les deux variables où l'on stocke les données (après avoir tout nettoyé et vérifié leur caractère unique !) :

    #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";}
    

  7. Enregistrer la sortie
  8. 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.


 
 

Charlène DENIS & Larisa NADEL