Лучший способ разбора RSS / Atom-каналов с помощью PHP [закрыто]
135
В настоящее время я использую Magpie RSS, но иногда это происходит из-за того, что RSS-канал или канал Atom сформированы неправильно. Есть ли другие варианты для разбора RSS и Atom-лент с помощью PHP?
Есть одна проблема с этим запросом, большинство читателей Feed используют основные XML-читатели php, и если XML не будет хорошо отформатирован, как того требуют стандарты XML, он упадет, вы можете посмотреть на те, которые не используют XML-читатели, и используют Text Reader, однако нагрузка на сервер резко возрастет. Я знаю, что на это дан ответ, я просто заставляю людей осознавать недостатки использования программ чтения XML-
лент
1
Никогда не пытайтесь анализировать неверный XML. Виноват источник.
Мне не нравятся такие «ответы», давать ссылки без каких-либо комментариев. Похоже, вы Google и ссылку на несколько лучших результатов. Тем более, что у asker есть некоторый опыт работы с RSS и ему нужен лучший парсер.
duality_
3
В случае, если кому-то нужен небольшой совет, Last RSS является самым простым из трех перечисленных выше. Требуется только 1 файл, и он может извлечь RSS в пределах 5 строк с приличным выводом массива.
Я использовал два из них, и LastRss кажется недостаточно хорошим, чтобы обеспечить полностью функциональный помощник, а SimplePie немного сложнее. Я хотел бы попробовать некоторые другие, но комментарии к этим библиотекам лучше понять людям, а не просто ссылки.
нуб
169
Я всегда использовал встроенные в PHP функции SimpleXML для разбора XML-документов. Это один из немногих универсальных синтаксических анализаторов, который имеет интуитивно понятную структуру, которая позволяет чрезвычайно легко создать значимый класс для чего-то определенного, например, для RSS-канала. Кроме того, он будет обнаруживать предупреждения и ошибки XML, и, найдя их, вы можете просто пропустить исходный код через HTML Tidy (как упоминалось в ceejayoz), чтобы очистить его и повторить попытку.
Рассмотрим этот очень грубый, простой класс с использованием 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;}}
Ну, у меня был один, но его съел форматер кода SO, так как над ним не было пустой строки. На связанной ноте вы не начали свое предложение с заглавной буквы. ;)
Брайан Клайн
4
Пожалуйста, измените $feed_uri = $feed_or_url;на $feed_uri = $file_or_url;... кроме этого, спасибо за этот код! Работает отлично!
Тим
5
Обратите внимание, что, хотя это отличное решение, оно будет анализировать только RSS-каналы в их текущей форме. Фиды Atom не будут анализироваться из-за их другой схемы.
Андраш Шепешази
9
Обратите внимание, что eregi_replaceтеперь устарела и была заменена, preg_replaceа также eregiс preg_match. Документацию можно найти здесь и здесь соответственно.
Можете ли вы дать мне RSS-канал, который вы используете?
PJunior
2
На случай, если вам интересно. Похоже, он использует канал Tumblr RSS. Anytumblrsite.com/rss даст вам тот же результат.
Андрей
3
Использовал 4 строки, отлично поработал :), но потом переписал 1-ю строку: $feed = file_get_contents('http://yourdomains.com/feed.rss');может быть менее интенсивно, чем file +
+1, вы не должны пытаться обойти любой XML, который не является правильно сформированным. У нас был плохой опыт с ними, поверьте мне, это была большая боль :(
Хелен Нили
35
Однако программисты не могут выбирать деловых партнеров и должны анализировать то, что им дают.
Эдмонд Майнфельдер
2
Что, если вы создаете универсальный ридер RSS / Atom? Если какой-либо неправильно сформированный XML-файл может «испортить» ваш HTML, кто такой Bozo? ;) Будьте либеральны в том, что вы получаете.
2013 г.
6
Библиотека HTML Tidy способна исправить некоторые искаженные файлы XML. Может помочь выполнение ваших каналов перед тем, как передать их парсеру.
Я использую SimplePie для анализа канала Google Reader, и он работает довольно хорошо и имеет приличный набор функций.
Конечно, я не тестировал его с плохо сформированными лентами RSS / Atom, поэтому я не знаю, как он справляется с ними, я полагаю, что Google вполне соответствует стандартам! :)
Ответы:
Ваши другие варианты включают в себя:
источник
Я всегда использовал встроенные в PHP функции SimpleXML для разбора XML-документов. Это один из немногих универсальных синтаксических анализаторов, который имеет интуитивно понятную структуру, которая позволяет чрезвычайно легко создать значимый класс для чего-то определенного, например, для RSS-канала. Кроме того, он будет обнаруживать предупреждения и ошибки XML, и, найдя их, вы можете просто пропустить исходный код через HTML Tidy (как упоминалось в ceejayoz), чтобы очистить его и повторить попытку.
Рассмотрим этот очень грубый, простой класс с использованием SimpleXML:
источник
$feed_uri = $feed_or_url;
на$feed_uri = $file_or_url;
... кроме этого, спасибо за этот код! Работает отлично!eregi_replace
теперь устарела и была заменена,preg_replace
а такжеeregi
сpreg_match
. Документацию можно найти здесь и здесь соответственно.С 4 строками я импортирую rss в массив.
Для более сложного решения
источник
$feed = file_get_contents('http://yourdomains.com/feed.rss');
может быть менее интенсивно, чем file +Я хотел бы представить простой скрипт для разбора RSS:
источник
Если фид не является правильно сформированным XML, вы должны его отклонить, без исключений. Вы имеете право называть создателя корма бозо .
В противном случае вы прокладываете путь, чтобы испортить HTML.
источник
Библиотека HTML Tidy способна исправить некоторые искаженные файлы XML. Может помочь выполнение ваших каналов перед тем, как передать их парсеру.
источник
Я использую SimplePie для анализа канала Google Reader, и он работает довольно хорошо и имеет приличный набор функций.
Конечно, я не тестировал его с плохо сформированными лентами RSS / Atom, поэтому я не знаю, как он справляется с ними, я полагаю, что Google вполне соответствует стандартам! :)
источник
Лично я использую BNC Advanced Feed Parser - мне нравится система шаблонов, которая очень проста в использовании.
источник
PHP RSS Reader - http://www.scriptol.com/rss/rss-reader.php - это полный, но простой парсер, используемый тысячами пользователей ...
источник
Еще один отличный бесплатный анализатор - http://bncscripts.com/free-php-rss-parser/ Он очень легкий (всего 3 КБ) и прост в использовании!
источник