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?


1
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.
Lothar

Respuestas:


28

Sus otras opciones incluyen:



189
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.
Raptor


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:

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
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.
SU Alaska

45

Con 4 líneas, importo un rss a una matriz.

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

Para una solución más compleja

$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
Solo lo intenté. No da una matriz
samayo

¿Me puede dar el feed RSS que está utilizando?
PJunior

2
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 +
implode

1
una línea, $ feed = json_decode (json_encode (simplexml_load_file (' news.google.com/?output=rss' )), verdadero);
ask_io

21

Me gustaría presentar un script simple para analizar 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++;
}

¡Solución clara y simple! Funciona bien
John T

13

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.


3
+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.


2

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! :)


1

Personalmente uso BNC Advanced Feed Parser, me gusta el sistema de plantillas que es muy fácil de usar.



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.