c
a
d
r
a
t






  Entrée  
   Ressources   
    Code  
     Triage  
 
+  Des ressources en corpus, isotopies et programmes
+  Des articles d’ études sur le traitement automatique de la langue
+  Les pages du site pour des recherches, informations, résumés...


 
     le programme d’ extraction de contenu RSS/ATOM en PHP   
Les diverses possibilités de récupération et de stockage d’informations syndiquées en page RSS ou ATOM, au format XML

 

 1.  format RSS et ATOM

Les formats RSS et ATOM sont les plus simples des spécifications de la norme XML. Leur rôle consiste à publier l’information d’un site, et tous les blogs génèrent ce format. Le nombre de balises contenant l’information est de moins d’une dizaine et l’entête est limité aussi à une dizaine de ligne. Ce format est donc lisible en code source d’un coup d’oeil. Comme tous les fichiers XML sa norme n’en est pas moins rigoureuse. La coexistence de deux formats assez proches, RSS et ATOM, alourdit la démarche d’appropriation par un programme extérieur, ce qui est leur fonction première. Une nette majorité des sites utilise RSS ou propose ATOM en second. Un même programme peut opérer sur les deux formats, voir inclure toutes les variantes comme l’accroissement du type de balise ou les formats spécifiques comme les podcasts. L’autre difficulté provient lors du non-respect des normes, la plus fréquente étant l’absence ou la mauvais formatage de la balise <pubDate> qui indique la date de publication de l’article ou l'absence partielle de <description>, problème que l'on trouve dans FeedBurner, qui est un site qui reformate et redistribue les flux.


 2.  possibilités d’extraction de contenu RSS

Le parcours puis le stockage des balises XML dans une page RSS peut s’opérer de plusieurs façons en PHP. Nous en retiendrons quatre :
- le parcours mot à mot ;
- les expressions régulières ;
- le module spécifique, ici simpleXML ;
- le hachage par caractères.

Une cinquième méthode repose sur l’insertion d’une balise <style> qui appelle un fichier XSL, à l’intérieur même de la page RSS, affichée ainsi modifiée dans une balise <iframe>. L’insertion s’opère en JavaScript à l’aide de l’instruction document.createElement. Cette méthode ne permet pas de retrouver les informations mais de les remettre en page. Il ressort de ces quatre essais d’extraction que la deuxième, celle des expressions régulières, est la plus appropriée, parce que la plus courte et la plus fiable.


 

 2.1.  parcours mot à mot

Une première méthode consiste à scinder le contenu texte du fichier en un tableau avec explode puis à le parcourir, forme à forme, en retenant le nom des balises XML. L’on peut ainsi utiliser ce type de fonction, pour les flux RSS. Une deuxième possibilité, plus courte, consiste à se servir des expressions régulières pour isoler tout ce qui se trouve entre deux balises.


 

 2.2.  expressions régulières


      A. Possibilité II : Expression régulière stockant dans un tableau tout caractère entre balise  

La variable $page est le fichier lu en format chaîne. La variable $tableau est un array où sera stockée chaque zone de caractères de la parenthèse, que l'on peut restituer dans une boucle. Dans celle-ci le paramètre [0] rend l'ensemble de la capture, tandis que [1] reproduit la capture de la parenthèse.

Une des difficultés récurrentes est d'ignorer les sauts de ligne de la page HTML, normalement résolue par l'option #s, équivalent de PCRE_DOTALL. À compléter à l'aide de str_replace en éliminant les caractères d'échappement /n /r /t. L'option #m, équivalent de PCRE_MULTILINE. sert toujours à éviter le problème des sauts de ligne, en poursuivant la recherche au-delà.

L’expression ne reprend pas le signe de fermeture de balise >, afin d'inclure celle du type <link href=". Un nettoyage du corpus est donc nécessaire pour fermer les balises comportant des attributs.


 

 2.3.  module spécifique

Une troisème solution est d'employer simpleXML en PHP 5. Si ce module récupère tout le contenu d'une balise XML avec facilité, il commence à peiner dès lors que la dite balise se charge d'attributs. Il convient probablement de paramétrer les instructions, sans savoir forcément quelle syntaxe va adopter la page XML explorée. Un autre tracas provient du contenu de la balise XML, parfois criblé de balises HTML variées, alors qu'une parfaite lisibilité impliquerait leur absence. Beaucoup d'hébergeurs de blogs reproduisent les balises de l'article dans le flux.


 

 2.4.  hachage par caractères

Quatrième solution : un découpage par suppression du texte précédant, avec pour point de repère le début et fin de balise. La page est découpée et revient à sa valeur initiale pour une balise d'un autre type (dc:date puis summary...). Une objection à ce découpage est que la quantité de types doit correspondre : s'il y a quatre dc:date il doit y avoir quatre summary. Ce qui semble, a priori incontournable pour les RSS, est trompeur car il existe une balise title dans l’entête, d'où la nécessité de la renommer ou de tronquer l’entête avant de soumettre le reste de la page. Le principe est donc d'hacher le texte position par position et s’assurer ainsi d'englober les balises HTML et les sauts de lignes, afin de retravailler ce contenu une fois isolé.

    B. Possibilité IV : Extraction du contenu d’une balise XML   

La fonction reconnaît le début d'une balise, c'est-à-dire <balise... , il faut donc modifier le fichier en amont s'il contient des intitulés semblables : <item> et <items>, comme en RSS 2.0. Une modication de la balise <title> pour <letitre> en début de fonction, car celle-ci n'est parfois pas reconnue.

 2.5.  solution appropriée

Le découpage de la page avec comme point de repère la balise se révèle une méthode plus sûre (solution deux avec les expressions régulières) pour maîtriser les étapes de capture, plus sommaire que de la scinder en mots (solution un) ou de la découper par balise (solution quatre). Une expression régulière précise apparaît stable et fiable sur une page RSS fortement parasitée par un contenu HTML chaotique, pour peu qu'elle soit un RSS valide.


 

 3.  lecture du fichier distant

La lecture d'une page RSS distante s'établit à l'aide de la librairie cURL en PHP 4 ou 5. Elle permet d'inclure des paramètres et de respecter certaines sécurités. Elle est plus sûre que l'instruction fopen, avec laquelle elle peut être complétementaire si cURL échoue.


 4.  restitution d’un contenu RSS

Une fois la page ouverte et passée en variable, les expressions régulières permettent d’isoler chaque contenu de balise. Les étapes consistent en un premier temps à retrancher à la page l'entête, de façon à ne laisser que les balises <item>, récupérées avec preg_match_all. Puis à isoler chaque contenu <item> avec preg_match, et associer chaque contenu de ces principales balises <title> <pubDate> <link> et <description> à une variable. Il suffit d'étendre la liste pour récupérer toutes les balises potentielles <author> <media>...

Ce code opère en deux étapes de récupération de façon à traiter l'intérieur d'une balise <item> l'une après l'autre, ceci en cas de disparité comme l'absence d'une balise, ou de code à l'intérieur d'une balise qui pourrait en perturber le rendu. Ébauche d’appropriation, ne sont pas retenues les balises ouvertes avec attributs, du type <link href= ., qu'il suffit de changer en aval.



     Le langage PHP    II.3.3.  
     Les programmes de nivellement de caractères à encodages multiples en PHP
     La page d’accueil
     Le sommaire des pages

       Site       motte 0.5  
       Imprimer  
     Rédaction / Publication : 19.04.2010     Révision : 29.05.2012
      http://cadrat.saynete.net2003 - 2018