La mejor manera de analizar los canales RSS / Atom con PHP [cerrado]
135
Actualmente estoy usando Magpie RSS, pero a veces se cae cuando el feed RSS o Atom no está bien formado. ¿Hay alguna otra opción para analizar fuentes RSS y Atom con PHP?
Hay un problema con esta solicitud, la mayoría de los lectores de Feed están usando los lectores XML centrales de php y si el XML no está bien formateado como lo requieren los estándares XML, se caerá, podría mirar aquellos que no usan lectores XML y usan un Text Reader, sin embargo, la carga en el servidor aumentará dramáticamente. Sé que esto se responde sólo estoy haciendo que las personas sean conscientes de los inconvenientes del uso de lectores de feeds XML
Barkermn01
1
Nunca intente analizar XML no válido. Culpa a la fuente.
No me gustan tales "respuestas", dando enlaces sin ningún comentario. Parece que lo buscas en Google y te enlazas con algunos de los mejores resultados. Especialmente porque el autor de la pregunta tiene experiencia en RSS y necesita un mejor analizador.
dualidad_
3
En caso de que alguien necesite un pequeño consejo, Last RSS es el más fácil entre los tres mencionados anteriormente. Solo 1 archivo "requiere" y puede buscar el RSS en 5 líneas, con una salida de matriz decente.
He usado dos de ellos y LastRss parece no ser lo suficientemente bueno como para proporcionar un ayudante completamente funcional y SimplePie es un poco demasiado complicado. Me gustaría probar algunos otros, pero los comentarios a esas bibliotecas son mejores para que la gente los entienda, no solo los enlaces.
noob
169
Siempre he usado las funciones SimpleXML integradas en PHP para analizar documentos XML. Es uno de los pocos analizadores genéricos que tiene una estructura intuitiva, lo que hace que sea extremadamente fácil crear una clase significativa para algo específico como una fuente RSS. Además, detectará advertencias y errores XML, y al encontrarlos, simplemente puede ejecutar la fuente a través de algo como HTML Tidy (como mencionó ceejayoz) para limpiarlo e intentarlo nuevamente.
Considere esta clase simple y muy aproximada usando 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;}}
tiene una etiqueta final sin etiqueta de inicio. ;)
Talvi Watia
130
Bueno, tenía uno, pero estaba siendo comido por el formateador de código de SO ya que no tenía una línea vacía encima. En una nota relacionada, no comenzaste tu oración con una letra mayúscula. ;)
Brian Cline
44
Cambie $feed_uri = $feed_or_url;a $feed_uri = $file_or_url;... aparte de eso, ¡gracias por este código! ¡Funciona muy bien!
Tim
55
Tenga en cuenta que, si bien esta solución es excelente, solo analizará las fuentes RSS en su forma actual. Las fuentes de Atom no se analizarán debido a su esquema diferente.
András Szepesházi
9
Tenga en cuenta que eregi_replaceahora está en desuso y ha sido reemplazado por preg_replacey eregicon preg_match. Las documentaciones se pueden encontrar aquí y aquí, respectivamente.
En caso de que te lo estés preguntando. Parece que está usando un feed tumblr rss. Anytumblrsite.com/rss le daría la misma salida.
andrewk
3
Usé las 4 líneas, hice un gran trabajo :) pero luego reescribí la primera línea: $feed = file_get_contents('http://yourdomains.com/feed.rss');podría ser menos intenso que file +
+1, no debe intentar evitar ningún XML que no esté bien formado. Hemos tenido malas experiencias con ellos, créanme, fue un gran dolor :(
Helen Neely
35
Sin embargo, los programadores no pueden elegir socios comerciales y tienen que analizar lo que se les da.
Edmond Meinfelder
2
¿Qué sucede si está construyendo un lector de fuentes RSS / Atom universal? Si algún archivo xml mal formado puede "ensuciar" su HTML, ¿quién es el Bozo? ;) Sea liberal en lo que recibe.
yPhil
6
La biblioteca HTML Tidy puede reparar algunos archivos XML con formato incorrecto. Ejecutar sus feeds antes de pasarlos al analizador puede ayudar.
Uso SimplePie para analizar un feed de Google Reader y funciona bastante bien y tiene un conjunto de características decente.
Por supuesto, no lo he probado con fuentes RSS / Atom mal formadas, así que no sé cómo se las arregla, ¡supongo que Google cumple con los estándares! :)
Respuestas:
Sus otras opciones incluyen:
fuente
Siempre he usado las funciones SimpleXML integradas en PHP para analizar documentos XML. Es uno de los pocos analizadores genéricos que tiene una estructura intuitiva, lo que hace que sea extremadamente fácil crear una clase significativa para algo específico como una fuente RSS. Además, detectará advertencias y errores XML, y al encontrarlos, simplemente puede ejecutar la fuente a través de algo como HTML Tidy (como mencionó ceejayoz) para limpiarlo e intentarlo nuevamente.
Considere esta clase simple y muy aproximada usando SimpleXML:
fuente
$feed_uri = $feed_or_url;
a$feed_uri = $file_or_url;
... aparte de eso, ¡gracias por este código! ¡Funciona muy bien!eregi_replace
ahora está en desuso y ha sido reemplazado porpreg_replace
yeregi
conpreg_match
. Las documentaciones se pueden encontrar aquí y aquí, respectivamente.Con 4 líneas, importo un rss a una matriz.
Para una solución más compleja
fuente
$feed = file_get_contents('http://yourdomains.com/feed.rss');
podría ser menos intenso que file +Me gustaría presentar un script simple para analizar RSS:
fuente
Si el feed no está bien formado XML, se supone que debe rechazarlo, sin excepciones. Tienes derecho a llamar al creador de feeds un bozo .
De lo contrario, está allanando el camino para desordenar en el que terminó HTML.
fuente
La biblioteca HTML Tidy puede reparar algunos archivos XML con formato incorrecto. Ejecutar sus feeds antes de pasarlos al analizador puede ayudar.
fuente
Uso SimplePie para analizar un feed de Google Reader y funciona bastante bien y tiene un conjunto de características decente.
Por supuesto, no lo he probado con fuentes RSS / Atom mal formadas, así que no sé cómo se las arregla, ¡supongo que Google cumple con los estándares! :)
fuente
Personalmente uso BNC Advanced Feed Parser, me gusta el sistema de plantillas que es muy fácil de usar.
fuente
El lector RSS de PHP - http://www.scriptol.com/rss/rss-reader.php - es un analizador completo pero simple utilizado por miles de usuarios ...
fuente
Otro gran analizador gratuito: http://bncscripts.com/free-php-rss-parser/ ¡ Es muy ligero (solo 3kb) y fácil de usar!
fuente