banniere
Ecrit par leknoppix le 5-07-2009 à 14:00:53
Parser un flux rss

Le flux RSS désigne une famille de formats XML utilisés pour la syndication de contenu Web.
L'usage le plus courant est de recevoir la liste des nouveaux articles publiés sur un blog ou un site d'informations, avec un résumé pour chaque article. Pour les recevoir, l'utilisateur doit s'abonner au flux à l'aide d'un agrégateur, ce qui lui permet de consulter rapidement les dernières mises à jour sans avoir à se rendre sur le site.

Dans ce petit tutoriel, je vais vous expliquer comment parser un flux rss de votre choix pour récupérer et afficher les informations de votre choix. Pour ce tutoriel, je part du principe que vous connaissez déjà les bases du langage php.

La première étape est consiste à déclarer les variables qui contiendra les l'adresses du flux rss mais également le nombre d'éléments a récupéré.

<?php
$adresse_flux             =        'http://leknoppix.fr/flux.rss'; // adresse du flux à afficher
$nombre_article        =        5; // nombre d'éléments à afficher
$size_texte        =         200; //nombre de caractères à afficher
?>

La seconde étape consiste a récupéré le contenu du flux rss. Dans la documentation php, une fonction php existe que permet de convertir le fichier xml en objet. La fonction est simplexml_load_file(). Il faut donc charger le flux rss dans cette fonction. 

<?php
//chargement du flux rss
$xml = simplexml_load_file($flux);
?>

La dernière étape correspond à créer le code qui permettra de récupérer les informations souhaitées dans le but de les afficher à notre guise. Avant de vous mettre le code qui permettra de traiter le flux rss, nous allons regarder et comprendre un flux rss. Pour faire cette étude, nous allons prendre le flux rss de ce site.

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<description>
Toute l'actualité du site http://leknoppix.fr
</description>
<link>http://leknoppix.fr</link>
<title>Le knoppix's Blog</title>
<language>fr</language>
<copyright>2007-2009 http://leknoppix.fr</copyright>
<image>
	<title>Le knoppix's Blog</title>
	<url>http://leknoppix.fr/images/tutix.png</url>
	<link>http://leknoppix.fr</link>
</image>
<item>
	<title>L'humour geek</title>
	<link>http://leknoppix.fr/article/l_humour_geek/index.html</link>
	<author>leknoppix</author>
	<image>image/l_humour_geek/image.png</image>
	<description>Encore quelques extraits de BD pour montrer l'humour geek.</description>
	<pubDate>Fri, 03 Jul 2009 18:41:21 +0200</pubDate>
	<guid>http://leknoppix.fr/article/l_humour_geek/index.html</guid>
</item>
<item>
	<title>Un peu d'humour de geek</title>
	<link>http://leknoppix.fr/article/un_peu_d_humour_de_geek/index.html</link>
	<author>leknoppix</author>
	<image>image/un_peu_d_humour_de_geek/image.jpg</image>
	<description>Bon voilà un petit article qui ne sert a rien si ce n'est que pour rire. 
Il s'agit de deux extraits humoristiques présents dans le monde des Geeks.</description>
	<pubDate>Thu, 02 Jul 2009 19:48:56 +0200</pubDate>
	<guid>http://leknoppix.fr/article/un_peu_d_humour_de_geek/index.html</guid>
</item>
</channel>
</rss>

Les balises <rss> permettent d'identifier qu'il s'agit d'un flux rss. La premiere balise <description> permet de donner une description au flux rss, cela permet à l'agregateur d'avoir une description de la source de ce flux. Les autres balises comme "link", "language", "copyright","image" sont accès simple à comprendre. Les balises <item> permettent d'identifier une actualité. Le parsage d'un flux rss consiste donc à récupérer les bonnes informations et de les afficher, c'est-à-dire récupérer le titre, link, description .... il faut donc dire, par le biais d'une boucle foreach, récupère moi dans la balise <item>, le titre, la description .... Voila donc le code:

<?php
echo '<ul">'."n";
$i = 0;
foreach ( $xml->channel->item as $value){
    if ( $i < $nombre_article ){
        echo '<li>         <a href="'.$value->link.'">'.utf8_decode($value->title).'</a>
<span>'
.utf8_decode($value->description).'</span></li>'."n"; echo '<br />'."n"; } $i++; } echo '</ul>'."n"; ?>

Dans la déclaration des variables, il manque encore un variable de inutiliser, la variable $size_texte qui contiendra le nombre de caractère a afficher au niveau de la description du flux. Il faut donc créer une fonction qui récupère la description pour compter et afficher le nombre de caractère que nous avons defini.

<?php
function comptecaractere($text , $size, $charset='utf-8'){
    $text = strip_tags ( html_entity_decode( $text , ENT_COMPAT, $charset ) );
    if ( strlen( $text) + 4 > $size ) {
        $text  = substr ( $text , 0 , $size).' ...' ;
    }   
    return $text;
}
?>

Dans cette fonction, la variable $charset permet de corriger les problèmes de caractères spéciaux. Cependant il faut modifier le code de parsage afin que la fonction comptecaractere puisse fonctionner.

<?php
echo '<ul">'."n";
$i = 0;
foreach ( $xml->channel->item as $value){
    if ( $i < $nb_items ){
        echo '<li>         <a href="'.$value->link.'">'.utf8_decode($value->title).'</a>
<span>'
.utf8_decode(comptecaractere($value->description, $size_texte )).'</span></li>'."n"; echo '<br />'."n"; } $i++; } echo '</ul>'."n"; ?>

Dans le traitement du parsage, j'ai fait un affiche très simple, un affichage en liste. Vous pouvez modifier à votre guise l'affichage puisqu'il s'agit d'une mise en page. Voila, je vous met le code final. Vous pouvez l'utiliser par exemple pour faire un système de slider comme celui présent sur la page d'accueil sur le site.

<?php
$flux             =        'http://leknoppix.fr/flux.rss'; // adresse du flux à afficher
$nombre_article        =        5; // nombre d'éléments à afficher
$size_texte        =         200; //nombre de caractères à afficher
 
function comptecaractere ($text , $size, $charset='utf-8'){
    $text = strip_tags ( html_entity_decode( $text , ENT_COMPAT, $charset ) );
    if ( strlen( $text) + 4 > $size ) {
        $text  = substr ( $text , 0 , $size).' ...' ;
    }   
    return $text;
}
//chargement du flux rss
$xml = simplexml_load_file($flux);
echo '<ul">'."n";
$i = 0;
foreach ( $xml->channel->item as $value){
    if ( $i < $nombre_article ){
        echo '<li>         <a href="'.$value->link.'">'.utf8_decode($value->title).'</a>
<span>'
.utf8_decode(comptecaractere($value->description, $size_texte )).'</span></li>'."n"; echo '<br />'."n"; } $i++; } echo '</ul>'."n"; ?>

Des problèmes sur ce petit tuto? N'hésitez pas à laisser vos questions dans le commentaire.

Je met une seconde version plus allégé d'un code:

 

<?php
$flux = 'http://leknoppix.fr/flux.rss'; // adresse du flux à afficher
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$flux);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$contenu=curl_exec($curl);
$xml=new SimpleXMLElement($contenu);
foreach($xml->channel->item as $v)
	{
echo "Titre: ".utf8_decode($v->title)."<br />";
echo "Description: ".utf8_decode($v->description)."<br />";
echo "Date de publication: ";
echo utf8_decode(ucfirst(strftime('%A %d %B %Y à %H:%M:%S', strtotime($v->pubDate))));
echo "<br /><hr>";
	}
?>

 

Publier sur mon compte twitterPublier sur mon viadeoPublier sur mon deliciousPublier sur mon compte twitter

Ajoute ton commentaire

Pseudo : *
E-Mail : *
MSN :
Site internet :
Blog :
Note : *
Commentaire : *
Ne pas compléter :

Le 22-01-2010 à 14:25:54 par misslilou

avataret hop une réponse de plus à une de mes interrogations existentiels sur le pourquoi du comment .... Merci

Note :  notenotenotenotenote
Le 24-09-2009 à 8:39:24 par leknoppix

avatar@Neofutur: Je supprime la fin du message car je n'es pas besoin de ton service car le mien me convient parfaitement. Ensuite, il s'agit d'un exemple à adapter en fonction de ta DOCTYPE et de ton CHARSET ENCODING.

Note :  notenotenotenotenote
Le 24-09-2009 à 6:11:06 par neofutur

avatarbon ca serai sympa de rajouter au minimum un DOCTYPE et un CHARSET ENCODING dans votre exemple . .. parce que la au final ca fait quand meme 49 erreurs de validation et ca s affiche pas sur tous les navigateurs . . . un collegue m a installe ca sur http://lachimere.net j en ai au moins pour quelques heures a rendre ca propre . . . Voir ce que ca donne sur http://validator.w3.org/check?uri=http://lachimere.net/ a part ca merci quand meme pour votre site, tres utile et plein de bonnes choses sympas ( par contre enlevez la saloperie allotrafic ca fait que la page n en finit pas de se charger ).

Note :  notenotenotenotenote
1 - 2

© 2007-2017