Najlepszy sposób na analizowanie kanałów RSS / Atom za pomocą PHP [zamknięte]
135
Obecnie używam Magpie RSS, ale czasami przewraca się, gdy kanał RSS lub Atom nie jest dobrze sformułowany. Czy są jakieś inne opcje analizowania kanałów RSS i Atom za pomocą PHP?
Jest jeden problem z tym żądaniem, większość czytników kanałów używa podstawowych czytników XML php i jeśli XML nie jest dobrze sformatowany zgodnie z wymaganiami standardów XML, może się przewrócić, możesz spojrzeć na te, które nie używają czytników XML i używają Text Reader jednak znacznie wzrośnie obciążenie serwera. Wiem, że odpowiedź na to pytanie po prostu uświadamiam ludziom wady korzystania z czytników kanałów XML
Barkermn01
1
Nigdy nie próbuj analizować nieprawidłowego XML. Winić źródło.
Nie lubię takich „odpowiedzi”, podając linki bez komentarza. Wygląda na to, że wyszukujesz go w Google i podajesz link do kilku najlepszych wyników. Zwłaszcza, że osoba pytająca ma pewne doświadczenie w obsłudze RSS i potrzebuje lepszego parsera.
duality_
3
Jeśli ktoś potrzebuje trochę porady, Last RSS jest najłatwiejszym z trzech wymienionych powyżej. Tylko 1 plik do „wymagania” i może pobrać RSS w 5 liniach, z przyzwoitym wyjściem tablicowym.
Użyłem dwóch z nich, a LastRss nie wydaje się wystarczająco dobry, zapewniając w pełni funkcjonalnego pomocnika, a SimplePie jest nieco zbyt skomplikowany. Chciałbym wypróbować inne, ale komentarze do tych bibliotek są dla ludzi lepsze, a nie tylko linki.
noob
169
Zawsze używałem funkcji SimpleXML wbudowanych w PHP do analizowania dokumentów XML. Jest to jeden z niewielu generycznych parserów, który ma intuicyjną strukturę, dzięki czemu niezwykle łatwo jest zbudować znaczącą klasę dla czegoś konkretnego, takiego jak kanał RSS. Dodatkowo wykryje ostrzeżenia i błędy XML, a po znalezieniu dowolnego możesz po prostu uruchomić źródło za pomocą czegoś takiego jak HTML Tidy (jak wspomniał ceejayoz), aby je wyczyścić i spróbować ponownie.
Rozważ tę bardzo szorstką, prostą klasę używającą 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;}}
Cóż, miałem jeden, ale był zjadany przez program do formatowania kodu SO, ponieważ nie miał nad nim pustej linii. A propos, nie rozpocząłeś zdania wielką literą. ;)
Brian Cline,
4
Zmień $feed_uri = $feed_or_url;na $feed_uri = $file_or_url;... inne niż to, dziękuję za ten kod! Działa świetnie!
Tim
5
Pamiętaj, że chociaż to rozwiązanie jest świetne, analizuje kanały RSS tylko w jego aktualnej formie. Kanały Atom nie będą analizowane ze względu na ich inny schemat.
András Szepesházi
9
Zauważ, że eregi_replacejest teraz przestarzały i został zastąpiony przez, preg_replacea także eregiz preg_match. Dokumentacje można znaleźć odpowiednio tutaj i tutaj .
Na wypadek, gdybyś się zastanawiał. Wygląda na to, że używa źródła RSS na tumblr. Anytumblrsite.com/rss dałoby ten sam wynik.
andrewk
3
Użyłem 4 linii, wykonałem świetną robotę :) ale potem przepisałem pierwszą linię: $feed = file_get_contents('http://yourdomains.com/feed.rss');może być mniej intensywna niż plik + implode
+1, nie powinieneś próbować obejść żadnego XML, który jest źle sformułowany. Mieliśmy z nimi złe doświadczenia, zaufaj mi, to był duży ból :(
Helen Neely
35
Jednak programiści nie mogą wybierać partnerów biznesowych i muszą analizować to, co otrzymują.
Edmond Meinfelder
2
A co jeśli tworzysz uniwersalny czytnik kanałów RSS / Atom? Jeśli jakikolwiek źle sformułowany plik xml może "zepsuć" twój HTML, kim jest Bozo? ;) Bądź liberalny w tym, co otrzymujesz.
yPhil
6
Biblioteka HTML Tidy może naprawić niektóre źle sformułowane pliki XML. Pomocne może być wykonanie przez to kanałów przed przekazaniem ich do parsera.
Używam SimplePie do analizowania kanału Google Reader i działa całkiem nieźle i ma przyzwoity zestaw funkcji.
Oczywiście nie testowałem go z nieprawidłowo sformułowanymi kanałami RSS / Atom, więc nie wiem, jak sobie z nimi radzi, zakładam, że Google jest dość zgodne ze standardami! :)
Odpowiedzi:
Twoje inne opcje obejmują:
źródło
Zawsze używałem funkcji SimpleXML wbudowanych w PHP do analizowania dokumentów XML. Jest to jeden z niewielu generycznych parserów, który ma intuicyjną strukturę, dzięki czemu niezwykle łatwo jest zbudować znaczącą klasę dla czegoś konkretnego, takiego jak kanał RSS. Dodatkowo wykryje ostrzeżenia i błędy XML, a po znalezieniu dowolnego możesz po prostu uruchomić źródło za pomocą czegoś takiego jak HTML Tidy (jak wspomniał ceejayoz), aby je wyczyścić i spróbować ponownie.
Rozważ tę bardzo szorstką, prostą klasę używającą SimpleXML:
źródło
$feed_uri = $feed_or_url;
na$feed_uri = $file_or_url;
... inne niż to, dziękuję za ten kod! Działa świetnie!eregi_replace
jest teraz przestarzały i został zastąpiony przez,preg_replace
a takżeeregi
zpreg_match
. Dokumentacje można znaleźć odpowiednio tutaj i tutaj .Za pomocą 4 linii importuję plik rss do tablicy.
Bardziej złożone rozwiązanie
źródło
$feed = file_get_contents('http://yourdomains.com/feed.rss');
może być mniej intensywna niż plik + implodeChciałbym przedstawić prosty skrypt do analizowania RSS:
źródło
Jeśli kanał nie jest poprawnie sformułowany w XML, powinieneś go odrzucić, bez wyjątków. Masz prawo nazywać twórcę kanału bozo .
W przeciwnym razie torujesz drogę do bałaganu, w którym skończył się HTML.
źródło
Biblioteka HTML Tidy może naprawić niektóre źle sformułowane pliki XML. Pomocne może być wykonanie przez to kanałów przed przekazaniem ich do parsera.
źródło
Używam SimplePie do analizowania kanału Google Reader i działa całkiem nieźle i ma przyzwoity zestaw funkcji.
Oczywiście nie testowałem go z nieprawidłowo sformułowanymi kanałami RSS / Atom, więc nie wiem, jak sobie z nimi radzi, zakładam, że Google jest dość zgodne ze standardami! :)
źródło
Osobiście używam BNC Advanced Feed Parser - podoba mi się system szablonów, który jest bardzo łatwy w użyciu
źródło
Czytnik PHP RSS - http://www.scriptol.com/rss/rss-reader.php - to kompletny, ale prosty parser używany przez tysiące użytkowników ...
źródło
Kolejny świetny darmowy parser - http://bncscripts.com/free-php-rss-parser/ Jest bardzo lekki (tylko 3kb) i prosty w użyciu!
źródło