menu menu2
1
2
3
4
5

Boîte à Outils 1



Une représentation des sorties XML de BAO 1:

Arborescence

Pour obtenir le résultat ci-dessus, il existe deux programmations Perl ayant extrait des informations BAO 1 puis on les transforme par XSLT des sorties XML en format HTML.

Un peu de présentation pour BAO 1

En étape BAO 1, le but est d'extraire les titres et les descriptions contenus dans chaque fichier XML de l’arborescence. On aura deux types de sorties : un fichier TXT et un fichier XML. Sachant que les fils RSS appartiennent à différentes rubriques du journal, un fichier de chaque type est produit pour chaque rubrique. Les expressions régulières et le module XML:: RSS vont nous aider à les extraire.

1er phase: Le parcours d'arborescence

Pour traiter chacun de ces fichiers dans dossier “2014”, le programme doit identifier quels objets de l'arborescence sont des dossiers et lesquels sont des fichiers. Le parcours d'arborescence se fait avec 'if (-d $file)' , pour identifier les dossiers, 'id (-f $file)' pour les fichiers.

my $path = shift(@_); opendir(DIR, $path) or die "Erreur d'ouvrir $!\n"; my @files = readdir(DIR); closedir(DIR); foreach my $file (@files) { next if $file =~ /^\.\.?$/; $file = $path."/".$file; if (-d $file) { &parcoursarborescencefichiers($file); } if (-f $file) { if ($file=~/\.xml$/) &&($file=~!~/\/fil.+\.xml$/)## 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


[ TOP ]

Les encodages

  • On peut extraire directement l'encodage du fichier. Car la première ligne du fichier RSS contient une déclaration d'encodage, exemple suivant :

    <?xml version="1.0" encoding="utf-8"?>


    On s'assure une lecture et une sortie dans le bon encodage:

    open(FILE,"<:encoding($encodage)", $file);


    if (uc($encodage) ne "utf-8") { utf8($titre); utf8($descrip); }


    L'expression régulière permet de le récupérer :

    open(FILE,$file); $texte=~/encoding= ?= ?[\'\"]([^\'\"]+)[\'\"]/i; my$encodage=$1; print: "ENCODAGE: $encodage\n"; ...

  • Identification:

    if ( $encodage ne "" ) { #si l'encodage n'est pas vide, faire le traitement }


    [ TOP ]

    Extraction des Informations

    Expressions Régulières

    while ($texte=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g) { my $titre=$1; #récupérer le titre et le contenu de description my $descrip=$2; ... ... $texte=~/(<channel>|<atom.+>)<title>([^<]+)<\/title>/; #récupérer les rubriques:sport, cinéma... my$rub=$1; #nettoyer les rubriques print "Rubrique : $rub\n";

    L'expressions régulières peuvent parcourir la structure arborescente des fichiers et arriver dans certains textes et de les extraire. Cette expression ci-dessus cherche les parties du texte qui contiennent les balises <title></title> et <description></description> directement sous la balise <item>, et les parenthèses isolent le contenu dans chacune de ces balises, le stockant respectivement dans les variables $1 et $2.

    Le Module XML::RSS

    Cette deuxième solution utilise XML::RSS, un module désigné spécifiquement pour les fichiers RSS.XML::RSS est un module spécialement pour RSS. Il faut parcourir l'arborescence du dossier, en traitant tous les fichiers XML. Les sorties sont pareilles que celles de l’expression régulière. Ce qui change est la manière d'extraire ces informations. XML::RSS permet d'exploiter la structure arborescente pour atteindre les nœuds et de produire un objet hiérarchique au lieu de l'objet plat produit par la méthode qui utilise l’expression régulière.

    Ce qui change est la manière d'extraire ces informations. Faire du fichier un objet XML::RSS permet d'exploiter la structure arborescente pour atteindre les nœuds et de produire un objet hiérarchique au lieu de l'objet plat produit par la méthode qui utilise les regex.

    my $rss = new XML::RSS; $rss->parsefile($file); ... ... foreach my $item (@{$rss->{'items'}}) { my $titre=$item->{'title'}; my $description=$item->{'description'}; … }

    La première ligne crée un nouvel objet XML::RSS dont la référence est stockée dans la variable $rss et la deuxième signifie que l'objet à analyser en forme RSS. Le fichier est situé au chemin indiqué par $path.

    L'avantage avec cette méthode est qu'il n'est pas nécessaire de faire la normalisation, c'est à dire la suppression des sauts de lignes, le traitement des encodages différents. C'est le module XML::RSS qui va gérer, et rend aussi la tâche de parcourir l'arborescence RSS plus facile. Cette méthode prend un peu plus de temps que les regex pour l'extraction.


    [ TOP ]


    Nettoyage du texte

    Une fois les informations extraites, il faut veiller à leur bon affichage et à la non-duplication de ces informations.

    Nettoyage du texte

    Une étape importante est le nettoyage des rubriques, des titres et des descriptions, parce qu'ils contiennent certaines suites de caractères étranges et des entités XML. Le premier traitement se fait avec le module Unicode::String qw(utf8) permettant d'encoder des chaînes en utf-8. Un second module, HTML::Entities, est utilisé pour convertir les caractères en entités HTML pour éviter des problèmes de codage lors de la création des nouveaux fichiers. La fonction nettoyage qui permet de supprimer les balises non pertinentes intégrées aux titres et descriptions, ainsi qu'à filtrer certains caractères.

    $rub=~s/Le ?Monde.fr ?://g; $rub=~s/ ?: ?Toute l'actualité sur Le Monde.fr.//g; $rub=~s/\x{E9}/e/g; # é $rub=~s/\x{E8}/e/g; # è $rub=~s/\x{E0}/a/g; # à $rub=~s/\x{7E}/e/g; # $rub=~s/\x{2E}/e/g; # . $rub=~s/\x{C9}/e/g; # É $rub=~s/\x{3A}/e/g; # : $rub=~s/ //g; $rub=uc($rub); # mise en majuscules $rub=~s/-LEMONDE.FR//g; $rub=~s/:TOUTEL'ACTUALITESURLEMONDE.FR.//g;


    sub nettoyage { my $texte=shift; $texte=~~s/]+>//g;; $texte=~~s/]+>//g;; $texte=~~s/\x{0152}/Œ/g;; $texte=~~s/\x{20ac}/€/g;; $texte=~~s/\x{20ac}/€/g;; $texte=~~s/\x{2018}/‘/g;; $texte=~~s/\x{201c}/“/g;; $texte=~~s/\x{201d}/”/g;; $texte=~~s/\x{2013}/-/g;; ........ }


    [ TOP ]

    Les Sorties en TXT et XML

    Les sorties en format TXT ne contiennent aucune balise, c'est simplement une liste des titres et des descriptions. Les sorties en format XML doivent être bien structurées avec des balises XML qui peuvent organiser les informations appropriées. La structuration des données sont mises en forme par des balises : “name”, “date” (pour identifier) “item” contient son titre et sa description (pour délimiter)…

    foreach my $rub=(@listeRubriques){ # pour chaque element dans la liste rubrique my $output1=($sorite.$rub. ".xml";)#sortie des fichiers xml my $output2=($sorite.$rub. ".txt";)#sortie des fichiers txt if (!open (out_XML,">:encoding(utf-8)",$output1)) { die "Erreur d'ouvrir file $output1"; } if (!open (out_TXT,">:encoding(utf-8)",$output2)) { die "Erreur d'ouvrir file $output2"; } #ouverture des balises XML du début du fichier print "out_XML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"; print "<EXTRACTION >\n"; close(out_XML); close(out_TXT); }

    La fin du traitement du fichier :

    print file_out "</items>"; print file_out "</file>"; close(file_out);

    Chaque paire titre-description est écrite sous une balise <item> et chacune entourée de une balise adaptée si: if (!(exists $dicoTitres{$titre}) and (!(exists $dicoDescrip{$descrip}))) [vérifier les doublons], puis

    Mettre les balise: $texteXML.="<item>\n<title>$titre</title>\n<description>$descrip</description>\n</item>\n";  

    Fermer les sorties avec des balises: $texteXML.="</items>\n</file>\n";

    La clôture:

    print out_XML "$texteXML"; print out_TXT "$texteBRUT"; close(out_XML); close(out_TXT);


    [ TOP ]

    Remarques

    Les fichiers en année 2014, la rubrique “Sciences” a la structure un peu particulière que les autres, du coupe, il faut faire attention à notre programme si notre méthode peut le récupérer ou pas. A noter que la méthode par XML::RSS prend plus de temps que celle par expressions régulières.


    XML Copy Editor

    Pour séparer le contenu par la rubrique, on a aussi essayer de conduire des sorties d'un script (script Perl issu du 2e cours, qui fait sortir tous les contenu sans classement) dans XML Copy Editor, puis on a utilisé Xpath pour extraire le contenu selon rubrique, et on les a stocké séparemment dans les dizaine de fichiers xml au nom de leur rubrique. Sur la base de fichiers xml, on a employé les expressions régulières pour supprimer les balises pour, finalement, stocker des fichiers sous forme txt;

    XSL

    On a transformé les résultats de BAO 1 en format HTML après une application de XSLT des sorties XML. Voilà une partie de codes et un exemple de rubrique PLANETE rangé par titre et description:

    <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" version="4.0" encoding="utf-8" indent="yes"/> <xsl:template match="/EXTRACTION"> <xsl:variable name="rubrique" select="local-name(./*[preceding-sibling::NOM])"/> <!-- nom du rubrique --> ... ... <xsl:template match="file"> <!-- tous les fichiers --> <xsl:if test="./items/item"> <xsl:variable name="fullname" select="./name"/><!-- nom du fichier --> <xsl:variable name="name" select="substring-before($fullname, '.')"/> <!--nom du ficher --> ... ...


    Arborescence


    [ Visualiser ]

    Téléchargement:

    Crée par Chang TAN et Si WU, Plurital 2015