L'exploitation d'un flux RSS

Séparer le grain de l'ivraie

XML en général a été crée avec le but d'être lisible et exploitable par l'oeil humain et par un parseur automatique. Les balises des fichiers RSS ne vont cependant être pas considérées dans les phases ultérieurs du traitement? C'est pourquoi on va s'en défaire pour se concentrer sur le texte simple.
Un fichier RSS est un fichier XML dont la forme dans le flux du Monde est la suivante:

<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet type='text/xsl' href='http://rss.feedsportal.com/xsl/fr/rss.xsl'?>



<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" version="2.0"><channel><title>Rendez-vous - Le Monde.fr</title><link>http://www.lemonde.fr</link><description>Toute l'actualité au moment de la connexion</description><language>en</language><copyright>Copyright Le Monde.fr</copyright><pubDate>Mon, 22 Sep 2008 14:29:07 GMT</pubDate><lastBuildDate>Mon, 22 Sep 2008 14:29:07 GMT</lastBuildDate><ttl>30</ttl><dc:date>2008-09-22T14:29:07Z</dc:date><dc:language>en</dc:language><dc:rights>Copyright Le Monde.fr</dc:rights><image><title>Rendez-vous - Le Monde.fr


</title>

    <url>http://medias.lemonde.fr/mmpub/img/lgo/lemondefr_rss.gif</url>

    <link>http://www.lemonde.fr</link></image><item><title>Des notes manuscrites dans son ordinateur

    </title>

<link>http://www.lemonde.fr/aujourd-hui/article/2008/09/22/des-notes-manuscrites-dans-son-ordinateur_1098118_3238.html#xtor=RSS-3238</link>

<description>Pour prendre des notes, rares sont ceux qui utilisent directement l&amp;#39;ordinateur. Le bon vieux stylo et le carnet restent, la plupart du temps, le passage obligé. Désormais, on peut continuer à écrire au stylo et retrouver ses notes presque instantanément en version électronique.&lt;img width='1' height='1' src='http://rss.feedsportal.com/c/205/f/3057/s/1f16e4b/mf.gif' border='0'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/19345583463/f/3057/c/205/s/32599627/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/19345583463/f/3057/c/205/s/32599627/a2.img" border="0"/&gt;&lt;/a&gt;

</description>

Le contenu qui nous intéresse est le texte à l'intérieur des balises

<description> ... </description>

Comme toujours en perl "there's more than one way to skin a cat", certains moyens sont cependant plus canoniques que d'autres:

les expressions régulières

Bien que moins adaptée au traitement d'un language complètement parenthésé (context-free) comme xml, les expressions régulières servent bien la cause ici car les formes à extraires sont assez simples.

 while (<>){ 

        if (m/<description>([^<]+)<\/description>/o){

my $ligne = $1;

push @contenu, $ligne; 

}

}

Le module XML::XPath

C'est la manière canonique de traiter du xml en utilisantle module XML::XPath::XMLParser pour analyser et obtenir une représentation interne de l'arborescence du document XML. my $arbre = XML::XPath->new(filename => $fichier); On détermine ensuite le noeud de l'abrec orrespondant à la balise qui nous intéresse grâce à une requête Xpath my $noeuds = $arbre->find('//item/title/following-sibling::description[1]'); Et on extrait le contenu chaque balise foreach my $noeud ($noeuds->get_nodelist) {
$contenu = XML::XPath->getNodeText($noeud);}

Nettoyage des fichiers

la catégorisation

Il est possible d'affiner la présentation des résultats en classant les flux par catégories lisibles. On utilise un tableau associatif qui établis la correspondance entre les les rubriques et leurs codes.

%rubriques=("3208","une",

"3210","international",

"3214","europe",

"3224","societe",

"3232","opinions",

"3234","economie",

"3236","medias",

"3238","rendez-vous",

"3242","sports",

"3244","environnement-sciences",

"3246","culture",

"3260","livres",

"3404","examens_2008",

"3476","cinema",

"3546","voyages",

"651865","technologies",

"823353","politique",

"987718","municipales-cantonales_2008",);

On peut ensuite rediriger le flux de sortie en fonction de ces rubriques pour par exemple baliser une sortie xml par sujet ou rassembler le contenu textuel par fichiers de rubriques: foreach $code(keys %rubriques){
my $rubrique = $rubriques{$code};
if($fName=~/$code/){...}}

le remplacement des entités html

Même principe, cette fois plus simplement utilisé pour remplaçer les entités:

%entites=("&#233;","é",

"&#234;","è",

"&amp;#39;","'",

"&amp;#34;","\"",

 "&#39;","'",

"&#34;","\"",

"&nbsp;"," ",

"&lt;", "<",);

dans le code suivant foreach $entite(keys %entites){
my $caractere = $entites{$entite};
$temp=~ s/$entites/$caractere/g;

“Getting information off the Internet is like taking a drink from a fire hydrant.”

- Mitchell Kapor