Beste Möglichkeit, RSS / Atom-Feeds mit PHP zu analysieren [geschlossen]


135

Ich verwende derzeit Magpie RSS, aber es fällt manchmal um, wenn der RSS- oder Atom-Feed nicht gut geformt ist. Gibt es andere Optionen zum Parsen von RSS- und Atom-Feeds mit PHP?


1
Es gibt ein Problem mit dieser Anfrage. Die meisten Feed-Reader verwenden die Kern-XML-Reader von PHP. Wenn das XML nicht gemäß den XML-Standards gut formatiert ist, fällt es um. Sie können sich diejenigen ansehen, die keine XML-Reader verwenden, und a verwenden Text Reader Die Belastung des Servers wird jedoch dramatisch zunehmen. Ich weiß, dass dies beantwortet wird. Ich mache die Leute nur auf die Nachteile der Verwendung von XML-Feed-Readern aufmerksam
Barkermn01

1
Versuchen Sie niemals, ungültiges XML zu analysieren. Beschuldige die Quelle.
Lothar

Antworten:


28

Ihre anderen Optionen umfassen:



189
Ich mag solche "Antworten" nicht und gebe Links ohne Kommentare. Sieht so aus, als würden Sie es googeln und auf einige Top-Ergebnisse verlinken. Zumal der Fragesteller über RSS-Erfahrung verfügt und einen besseren Parser benötigt.
Dualität_

3
Für den Fall, dass jemand ein wenig Rat braucht, ist Last RSS das einfachste unter den drei oben aufgeführten. Nur 1 Datei "erforderlich", und kann das RSS innerhalb von 5 Zeilen mit einer anständigen Array-Ausgabe abrufen.
Raptor


Ich habe zwei davon verwendet und LastRss scheint nicht gut genug zu sein, um einen voll funktionsfähigen Helfer bereitzustellen, und SimplePie ist etwas zu kompliziert. Ich würde gerne andere ausprobieren, aber Kommentare zu diesen Bibliotheken sind für die Leute besser zu verstehen, nicht nur für Links.
Noob

169

Ich habe immer die in PHP integrierten SimpleXML-Funktionen verwendet , um XML-Dokumente zu analysieren. Es ist einer der wenigen generischen Parser, der eine intuitive Struktur aufweist, die es extrem einfach macht, eine aussagekräftige Klasse für etwas Bestimmtes wie einen RSS-Feed zu erstellen. Darüber hinaus werden XML-Warnungen und -Fehler erkannt. Wenn Sie eine finden, können Sie die Quelle einfach über HTML Tidy (wie von ceejayoz erwähnt) ausführen, um sie zu bereinigen und erneut zu versuchen.

Betrachten Sie diese sehr grobe, einfache Klasse mit 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
Sie haben ein End-Tag ohne Start-Tag. ;)
Talvi Watia

130
Nun, ich hatte eines, aber es wurde von SOs Code-Formatierer gegessen, da es keine leere Zeile darüber hatte. In einem ähnlichen Zusammenhang haben Sie Ihren Satz nicht mit einem Großbuchstaben begonnen. ;)
Brian Cline

4
Bitte wechseln Sie $feed_uri = $feed_or_url;zu $feed_uri = $file_or_url;... anders als das, danke für diesen Code! Es funktioniert super!
Tim

5
Beachten Sie, dass diese Lösung zwar großartig ist, jedoch nur RSS-Feeds in der aktuellen Form analysiert. Atom-Feeds werden aufgrund ihres unterschiedlichen Schemas nicht analysiert.
András Szepesházi

9
Beachten Sie, dass dies eregi_replacejetzt veraltet ist und sowohl durch preg_replaceals auch eregidurch ersetzt wurde preg_match. Dokumentationen finden Sie hier bzw. hier .
ITS Alaska

44

Mit 4 Zeilen importiere ich ein RSS in ein Array.

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

Für eine komplexere Lösung

$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
Ich habe es gerade versucht. Es gibt kein Array
Samayo

Kannst du mir den RSS-Feed geben, den du verwendest?
Juni

2
Für den Fall, dass Sie sich fragen. Es sieht so aus, als würde er einen Tumblr-RSS-Feed verwenden. Anytumblrsite.com/rss würde Ihnen die gleiche Ausgabe geben.
Andrewk

3
Habe die 4 Zeilen benutzt, habe einen tollen Job gemacht :) aber dann habe ich die 1. Zeile umgeschrieben: ist $feed = file_get_contents('http://yourdomains.com/feed.rss'); vielleicht weniger intensiv als file + implode
Guidouil

1
eine Zeile, $ feed = json_decode (json_encode (simplexml_load_file (' news.google.com/?output=rss' )), true);
fragte_io

21

Ich möchte ein einfaches Skript zum Parsen von RSS einführen:

$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++;
}

Klare und einfache Lösung! Funktioniert gut.
John T

13

Wenn Feed kein wohlgeformtes XML ist, sollten Sie es ausnahmslos ablehnen. Sie haben das Recht, den Feed-Ersteller als Bozo zu bezeichnen .

Andernfalls ebnen Sie den Weg, um das HTML in Unordnung zu bringen.


3
+1, Sie sollten nicht versuchen, XML zu umgehen, das nicht gut geformt ist. Wir haben schlechte Erfahrungen mit ihnen gemacht, vertrau mir, es war ein großer Schmerz :(
Helen Neely

35
Programmierer können jedoch keine Geschäftspartner auswählen und müssen analysieren, was ihnen gegeben wird.
Edmond Meinfelder

2
Was ist, wenn Sie einen universellen RSS / Atom-Feed-Reader bauen? Wenn eine schlecht geformte XML-Datei Ihren HTML-Code "durcheinander bringen" kann, wer ist der Bozo? ;) Sei liberal in dem, was du erhältst.
yPhil

6

Die HTML Tidy-Bibliothek kann einige fehlerhafte XML-Dateien reparieren. Es kann hilfreich sein, Ihre Feeds zu durchlaufen, bevor Sie sie an den Parser weiterleiten.


2

Ich benutze SimplePie , um einen Google Reader-Feed zu analysieren. Er funktioniert ziemlich gut und verfügt über einen anständigen Funktionsumfang.

Natürlich habe ich es nicht mit nicht gut geformten RSS / Atom-Feeds getestet, daher weiß ich nicht, wie es damit umgeht. Ich gehe davon aus, dass Google ziemlich standardkonform ist! :) :)


1

Persönlich verwende ich BNC Advanced Feed Parser - ich mag das Vorlagensystem, das sehr einfach zu bedienen ist



-2

Ein weiterer großartiger kostenloser Parser - http://bncscripts.com/free-php-rss-parser/ Es ist sehr leicht (nur 3 KB) und einfach zu bedienen!


Ich kann nicht sagen, dass es mit gzinflate und base64_decode "großartig" ist, normalerweise aus Sicherheitsgründen deaktiviert.
fragte_io

Es ist eine tote Verbindung für die Vermarktung von Schweinswalen.
Sagive SEO
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.