Meilleur moyen d'analyser les flux RSS / Atom avec PHP [fermé]


135

J'utilise actuellement Magpie RSS mais cela tombe parfois lorsque le flux RSS ou Atom n'est pas bien formé. Existe-t-il d'autres options pour analyser les flux RSS et Atom avec PHP?


1
Il y a un problème avec cette demande, la plupart des lecteurs de flux utilisent les lecteurs XML de base de php et si le XML n'est pas bien formaté comme l'exigent les normes XML, il tombera, vous pouvez regarder ceux qui n'utilisent pas de lecteurs XML et utiliser un Text Reader cependant la charge sur le serveur augmentera considérablement. Je sais que cela est répondu, je fais juste prendre conscience aux gens des inconvénients de l'utilisation de lecteurs de flux XML
Barkermn01

1
N'essayez jamais d'analyser du XML invalide. Blâmez la source.
Lothar

Réponses:


28


189
Je n'aime pas ces «réponses», donnant des liens sans aucun commentaire. On dirait que vous recherchez sur Google et créez un lien vers quelques meilleurs résultats. Surtout que le demandeur a une certaine expérience RSS et a besoin d'un meilleur analyseur.
duality_

3
Au cas où quelqu'un aurait besoin d'un petit conseil, Last RSS est le plus simple parmi les trois énumérés ci-dessus. Un seul fichier à "exiger", et peut récupérer le RSS dans les 5 lignes, avec une sortie de tableau décent.
Raptor


J'en ai utilisé deux et LastRss ne semble pas assez bon pour fournir une aide entièrement fonctionnelle et SimplePie est un peu trop compliqué. J'aimerais en essayer d'autres, mais les commentaires sur ces bibliothèques sont mieux compris pour les gens, pas seulement les liens.
noob

169

J'ai toujours utilisé les fonctions SimpleXML intégrées à PHP pour analyser les documents XML. C'est l'un des rares analyseurs génériques à avoir une structure intuitive, ce qui rend extrêmement facile la création d'une classe significative pour quelque chose de spécifique comme un flux RSS. De plus, il détectera les avertissements et les erreurs XML, et après en trouver, vous pourrez simplement exécuter la source via quelque chose comme HTML Tidy (comme ceejayoz l'a mentionné) pour le nettoyer et le réessayer.

Considérez cette classe très grossière et simple utilisant SimpleXML:

class BlogPost
{
    var $date;
    var $ts;
    var $link;

    var $title;
    var $text;
}

class BlogFeed
{
    var $posts = array();

    function __construct($file_or_url)
    {
        $file_or_url = $this->resolveFile($file_or_url);
        if (!($x = simplexml_load_file($file_or_url)))
            return;

        foreach ($x->channel->item as $item)
        {
            $post = new BlogPost();
            $post->date  = (string) $item->pubDate;
            $post->ts    = strtotime($item->pubDate);
            $post->link  = (string) $item->link;
            $post->title = (string) $item->title;
            $post->text  = (string) $item->description;

            // Create summary as a shortened body and remove images, 
            // extraneous line breaks, etc.
            $post->summary = $this->summarizeText($post->text);

            $this->posts[] = $post;
        }
    }

    private function resolveFile($file_or_url) {
        if (!preg_match('|^https?:|', $file_or_url))
            $feed_uri = $_SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url;
        else
            $feed_uri = $file_or_url;

        return $feed_uri;
    }

    private function summarizeText($summary) {
        $summary = strip_tags($summary);

        // Truncate summary line to 100 characters
        $max_len = 100;
        if (strlen($summary) > $max_len)
            $summary = substr($summary, 0, $max_len) . '...';

        return $summary;
    }
}

2
vous avez une balise de fin sans balise de début. ;)
Talvi Watia

130
Eh bien, j'en avais un, mais il était mangé par le formateur de code de SO car il n'avait pas de ligne vide au-dessus. Dans le même ordre d'idées, vous n'avez pas commencé votre phrase par une majuscule. ;)
Brian Cline

4
S'il vous plaît changer $feed_uri = $feed_or_url;pour $feed_uri = $file_or_url;... autre que cela, merci pour ce code! Cela fonctionne très bien!
Tim

5
Notez que même si cette solution est excellente, elle analysera uniquement les flux RSS dans sa forme actuelle. Les flux Atom ne seront pas analysés en raison de leur schéma différent.
András Szepesházi

9
Notez qu'il eregi_replaceest désormais obsolète et a été remplacé par preg_replaceainsi que eregipar preg_match. Des documentations peuvent être trouvées ici et ici respectivement.
ITS Alaska

45

Avec 4 lignes, j'importe un rss dans un tableau.

$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Pour une solution plus complexe

$feed = new DOMDocument();
 $feed->load('file.rss');
 $json = array();
 $json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
 $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

 $json['item'] = array();
 $i = 0;

 foreach($items as $key => $item) {
 $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
 $guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue;

 $json['item'][$key]['title'] = $title;
 $json['item'][$key]['description'] = $description;
 $json['item'][$key]['pubdate'] = $pubDate;
 $json['item'][$key]['guid'] = $guid; 
 }

echo json_encode($json);

2
J'ai juste essayé. Il ne donne pas de tableau
samayo

pouvez-vous me donner le flux rss que vous utilisez?
PJunior

2
Au cas où vous vous poseriez la question. On dirait qu'il utilise un flux rss tumblr. Anytumblrsite.com/rss vous donnerait le même résultat.
andrewk

3
J'ai utilisé les 4 lignes, j'ai fait un excellent travail :) mais ensuite j'ai réécrit la 1ère ligne: $feed = file_get_contents('http://yourdomains.com/feed.rss'); peut-être moins intensive que file + imploser
Guidouil

1
une ligne, $ feed = json_decode (json_encode (simplexml_load_file (' news.google.com/?output=rss' )), true);
demandé_io le

21

Je voudrais introduire un script simple pour analyser RSS:

$i = 0; // counter
$url = "http://www.banki.ru/xml/news.rss"; // url to parse
$rss = simplexml_load_file($url); // XML parser

// RSS items loop

print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src

foreach($rss->channel->item as $item) {
if ($i < 10) { // parse only 10 items
    print '<a href="'.$item->link.'">'.$item->title.'</a><br />';
}

$i++;
}

Solution claire et simple! Fonctionne bien.
John T

13

Si le flux n'est pas un XML bien formé, vous êtes censé le rejeter, sans exception. Vous avez le droit d'appeler le créateur de flux un bozo .

Sinon, vous préparez le terrain pour gâcher ce HTML.


3
+1, vous ne devez pas essayer de contourner un XML qui n'est pas bien formé. Nous avons eu de mauvaises expériences avec eux, croyez-moi, c'était une grosse douleur :(
Helen Neely

35
Cependant, les programmeurs n'ont pas la possibilité de choisir des partenaires commerciaux et doivent analyser ce qui leur est donné.
Edmond Meinfelder

2
Et si vous construisez un lecteur de flux RSS / Atom universel? Si un fichier xml mal formé peut «gâcher» votre HTML, qui est le Bozo? ;) Soyez libéral dans ce que vous recevez.
yPhil

6

La bibliothèque HTML Tidy est capable de corriger certains fichiers XML mal formés. L'exécution de vos flux avant de les transmettre à l'analyseur peut aider.


2

J'utilise SimplePie pour analyser un flux Google Reader et cela fonctionne plutôt bien et dispose d'un ensemble de fonctionnalités décent.

Bien sûr, je ne l'ai pas testé avec des flux RSS / Atom non bien formés, donc je ne sais pas comment il y fait face, je suppose que Google est assez conforme aux normes! :)


1

Personnellement, j'utilise BNC Advanced Feed Parser - j'aime le système de template qui est très facile à utiliser



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.