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?
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.
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.
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:
classBlogPost{var $date;var $ts;var $link;var $title;var $text;}classBlogFeed{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 =newBlogPost();
$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;}}privatefunction 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;}privatefunction 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;}}
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.
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
+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.
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! :)
Réponses:
Vos autres options incluent:
la source
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:
la source
$feed_uri = $feed_or_url;
pour$feed_uri = $file_or_url;
... autre que cela, merci pour ce code! Cela fonctionne très bien!eregi_replace
est désormais obsolète et a été remplacé parpreg_replace
ainsi queeregi
parpreg_match
. Des documentations peuvent être trouvées ici et ici respectivement.Avec 4 lignes, j'importe un rss dans un tableau.
Pour une solution plus complexe
la source
$feed = file_get_contents('http://yourdomains.com/feed.rss');
peut-être moins intensive que file + imploserJe voudrais introduire un script simple pour analyser RSS:
la source
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.
la source
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.
la source
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! :)
la source
Personnellement, j'utilise BNC Advanced Feed Parser - j'aime le système de template qui est très facile à utiliser
la source
Le lecteur PHP RSS - http://www.scriptol.com/rss/rss-reader.php - est un analyseur complet mais simple utilisé par des milliers d'utilisateurs ...
la source
Un autre excellent analyseur gratuit - http://bncscripts.com/free-php-rss-parser/ Il est très léger (seulement 3 Ko) et simple à utiliser!
la source