Парсер rss ленты. Подробнее о работе. А теперь о развитии

Как говорится: «xml это такая штука, от которой всем очень хорошо...» - но от этого не становится легче. Есть такой стандарт XML документов, как RSS. Данная заметка посвящена тому, как можно парсить RSS-фиды средствами PHP.

Рассматриваемый XML парсер - SimpleXML. Несмотря на то, что он очень прост, стоит помнить, что данное расширение присутствует только в PHP 5, хотя есть библиотеки и для более ранних версий, но об этом уже позаботьтесь сами. Да и валидность многих RSS-лент желает лучшего. Остается лишь придумывать «костыли» и использовать то, что имеем.

Так или иначе, наша задача состоит в том, чтобы средствами PHP загрузить данные RSS-ленты и вывести их на экран в том виде, который нам необходим. Отдельно отмечу, что разобравшись с сутью вопроса вы сможете легко применить полученные знания в самых разных областях связанных с парсингом XML изображений.

Итак, начнем с того, что введем переменную, значением которой будет RSS-фид, что нас интересует. Например:

$rss = "http://k.img.com.ua/rss/ru/news.xml";

Теперь нам необходимо загрузить и отпарсить эти данные. Здесь я приведу два способа. Первый позволяет считать RSS-фид обычным образом и используя SimpleXML как парсинг строки данных. Например:

$xmlstr = @file_get_contents($rss);
if($xmlstr===false)die("Error connect to RSS: ".$rss);
$xml = new SimpleXMLElement($xmlstr);

Как вы видите мы:
- скачали наш RSS-фид в строку, ставшей значением переменной $xmlstr;
- проверили, удалось-ли загрузить RSS-ленту;
- отпарсили данные RSS-фида и присвоили результат переменной $xml;
- проверили, удалось-ли отпарсить данные RSS-ленты.

Всю эту процедуру можно упростить следующим образом:

$xml = @simplexml_load_file($rss);
if($xml===false)die("Error parse RSS: ".$rss);

Сравнив два примера, вы легко найдете отличия и поймете суть. Так что не будем останавливаться на достигнутом, и пойдем дальше. Теперь мы имеем данные RSS-ленты в удобном для обработки формате. Здесь и объектно-ориентированный подход и массивы данных. Чтобы стало понятнее, приведу пример вывода данных RSS-ленты:

Foreach($xml->xpath("//item") as $item){
echo "".$item->title."(".$item->pubDate.")";
echo "
".$item->description."
";
}

Как Вы видите, здесь я применил Xpath запрос для выборки массива записей RSS-фида. Обратите внимание, что значением является «ребенок» item, отец которого channel (см. описание формата RSS). Именно поэтому имеем два слеша впереди. Чтобы было нагляднее, приведу пример без использования Xpath:

Foreach($xml->channel->item as $item) {

Стоит также отметить, что мы получаем объект $item, параметры которого и выводим на экран.

На этом вроде и все. Как видите SimpleXML действительно прост.

Теги: RSS, SimpleXML

Данная статья не подлежит комментированию, поскольку её автор ещё не является

Песочница

Командир судна 25 января 2011 в 21:03

  • Чулан *

Как говорится: «xml это такая штука, от которой всем очень хорошо...» - но от этого не становится легче. Есть такой стандарт XML документов, как RSS. Данная заметка посвящена тому, как можно парсить RSS-фиды средствами PHP.

Рассматриваемый XML парсер - SimpleXML. Несмотря на то, что он очень прост, стоит помнить, что данное расширение присутствует только в PHP 5, хотя есть библиотеки и для более ранних версий, но об этом уже позаботьтесь сами. Да и валидность многих RSS-лент желает лучшего. Остается лишь придумывать «костыли» и использовать то, что имеем.

Так или иначе, наша задача состоит в том, чтобы средствами PHP загрузить данные RSS-ленты и вывести их на экран в том виде, который нам необходим. Отдельно отмечу, что разобравшись с сутью вопроса вы сможете легко применить полученные знания в самых разных областях связанных с парсингом XML изображений.

Итак, начнем с того, что введем переменную, значением которой будет RSS-фид, что нас интересует. Например:

$rss = "http://k.img.com.ua/rss/ru/news.xml";

Теперь нам необходимо загрузить и отпарсить эти данные. Здесь я приведу два способа. Первый позволяет считать RSS-фид обычным образом и используя SimpleXML как парсинг строки данных. Например:

$xmlstr = @file_get_contents($rss);
if($xmlstr===false)die("Error connect to RSS: ".$rss);
$xml = new SimpleXMLElement($xmlstr);

Как вы видите мы:
- скачали наш RSS-фид в строку, ставшей значением переменной $xmlstr;
- проверили, удалось-ли загрузить RSS-ленту;
- отпарсили данные RSS-фида и присвоили результат переменной $xml;
- проверили, удалось-ли отпарсить данные RSS-ленты.

Всю эту процедуру можно упростить следующим образом:

$xml = @simplexml_load_file($rss);
if($xml===false)die("Error parse RSS: ".$rss);

Сравнив два примера, вы легко найдете отличия и поймете суть. Так что не будем останавливаться на достигнутом, и пойдем дальше. Теперь мы имеем данные RSS-ленты в удобном для обработки формате. Здесь и объектно-ориентированный подход и массивы данных. Чтобы стало понятнее, приведу пример вывода данных RSS-ленты:

Foreach($xml->xpath("//item") as $item){
echo "".$item->title."(".$item->pubDate.")";
echo "
".$item->description."
";
}

Как Вы видите, здесь я применил Xpath запрос для выборки массива записей RSS-фида. Обратите внимание, что значением является «ребенок» item, отец которого channel (см. описание формата RSS). Именно поэтому имеем два слеша впереди. Чтобы было нагляднее, приведу пример без использования Xpath:

Foreach($xml->channel->item as $item) {

Стоит также отметить, что мы получаем объект $item, параметры которого и выводим на экран.

На этом вроде и все. Как видите SimpleXML действительно прост.

Теги: RSS, SimpleXML

Данная статья не подлежит комментированию, поскольку её автор ещё не является

Зачастую нам приходится работать с большими объемами данных, такими как новости, товары и другая немаловажная информация.

В некоторых случаях лучше всего часть работы отдать скриптам, например – парсинг и представление этих данных на вашем сайте.

Сегодня мы подробно рассмотрим, как осуществить парсинг RSS-ленты и по аналогии – XML-файлов типа прайсов и других.

Итак, предположим, что вы нашли сайт, который предоставляет RSS-ленту в таком формате:

Все для создания сайтов: <a href="/shablony-bez-registracii-gde-vzyat-wordpress-temy-wordpress-themes-squadfree.html">бесплатные шаблоны</a>, скрипты, хаки и многое другое. https://www.pandoge.com Ты веб-мастер и любишь свое дело? Перед тобой библия для практикующих веб-разработчиков. Новости блога https://www.pandoge.com/novosti_bloga/ Новости сайта, анонсы и обзоры в одном разделе - чтобы вы всегда были в курсе событий на нашем блоге. Модули и скрипты https://www.pandoge.com/moduli_i_skripty/ Вы хотите создать функциональный и посещаемый ресурс без вложений? Достичь цели вам помогут авторские скрипты и модули – интегрируйте и получайте результат.

Что мы здесь видим? Это блок информации о ленте и два материала, заключенных в теге «item ».

Давайте теперь постараемся получить все необходимые нам данные.

Поскольку основная наша идея – это сформировать свою ленту новостей на основе полученных данных, для начала мы получим информацию о текущей ленте.

Во всем примере мы будем использовать «SimpleXML », помогающий без особого труда обрабатывать XML-файлы.

Тогда код для получения основной информации о ленте будет выглядеть следующим образом:

channel->title; // Имя ленты $link_channel = $rss->channel->link; // Ссылка на источник $description_channel = $rss->channel->description; // Описание ленты echo $description_channel; // Выводим описание?>

Обратите внимание , что название тегов может немного отличаться – это не играет никакой роли, в вашем же случае – вы все делаете по аналогии.

Так, с основной информацией разобрались, теперь самое интересное – парсинг материалов.

В отличие от основной информации, материалов может быть несколько, и для того, чтобы получить их все – мы будем использовать цикл «foreach ».

И получение уже самих материалов на примере нашей RSS-ленты будет выглядеть следующим образом:

channel->item as $items) { echo <<{$items->title}

{$items->description}

link}">Подробнее HTML; } ?>

На выходе вы получите примерно такую картину:

Если у вас это не произошло – пишите об этом в комментариях.

По такому принципу парсятся все XML-файлы, меняется лишь их структура. Если в вашем файле присутствуют параметры в тегах и вы не знаете, как их получить – рекомендуем почитать .

Парсер контента RSS лент, с возможностью скачивания медиа-контента на сайт.

При добавлении полей ленты, которые надо парсить, вместо названия поля (title или enclosure) можно указать @INLINE чанк, который будет обработан Fenom . Благодаря этому, в этих полях можно выстраивать совершенно любую логику, вплоть до создания новых разделов «на ходу».

Подробнее о работе

Стояла задача, как можно больше упростить взаимодействие с компонентом, поэтому жду мнений, насколько компонент прост в управлении.

Добавляем задание

Заходим на страницу компонента, жмём Добавить задание => Добавить RSS-ленту .
На вкладке Основное заполняем примерно так:

Переключаемся на вкладку Конфигурация , где можно указать:

  • Шаблон для создаваемых ресурсов,
  • Контекст,
  • Родительский контейнер в пределах выбранного контекста,
  • Сконфигурировать скачивание медиа-контента,
  • При необходимости поменять базовый тег ленты и базовый тег записи.

Расширения медиа-контента и папки для сохранения каждого из расширений указываются в JSON.

Добавляем поля для парсинга

На только что добавленном задании нажимаем правой кнопкой и выбираем Поля задания :

Откроется список полей задания, который пока пуст.

Помимо добавления полей задания мы можем просмотреть Массив значений ленты - это распечатанный массив с данным из первой записи ленты:

Запоминаем названия полей, которые нам надо парсить на сайт и кликаем Добавить поле . Откроется окошко с возможностью указать:

  1. Системное поле . Выпадающий список системных полей ресурса и ТВ-полей.
  2. Поле в источнике . Текстовое поле, в которое нужно ввести наименование тега в RSS-ленте.
    Можно указать @INLINE чанк, который будет обработан Fenom из pdoTools . В чанке содержатся плейсхолдеры всех возможных полей из RSS-ленты, которые имеются в записи между тегами item , а также массив с настройками задания $_task .
    За счёт внедрения в данное поле Fenom , можно будет, получая значение из тега category (как например в RSS Lenta.ru) делать выборку по базе ресурсов, в поисках ID аналогичной категории на нашем сайте, а если не найдено - добавлять.
    Тег enclosure и ему подобные, указываются либо через чанк: «@INLINE {$enclosure["url"]}», либо в виде CSS селектора: «enclosure».
    Если не указано или значение по данному полю в ленте пустое, то в качестве значения для Системное поле будет взято значение из следующего поля - Значение по-умолчанию .
  3. Значение по-умолчанию . В данном поле можно указать значение, которое будет записано в Системное поле . Например, если мы в Системное поле выбрали class_key , то, чтобы создавались Тикеты, мы в поле Значение по-умолчанию пишем «Ticket», а Поле в источнике оставляем пустым.
    Такую же «магию» можно сделать и с полем published , указав в значении по-умолчанию цифру «1». Тогда ресурс на сайт будет добавляться сразу опубликованным.

Помимо основых полей с данными, которые необходимо выгрузить на сайт, нам надо ещё добавить поле, по которому пакет будет понимать, что данная запись уже есть на сайте. Для этого добавляем новое поле , значение Системное поле оставляем пустым, а в Поле в источнике пишем, например, «guid» (потому что он менее всего подвержен изменениям). Должно быть как-то так:

Сохраняем. В списке полей на этом поле ставим указатель Уникальное поле (кнопка со звездой слева):

Всё готово к парсингу, как к единоразовому, так и к ежеминутному (у компонента есть скрипт для запуска заданий из крона).

Спасибо за спонсорскую поддержку!

P.S. Владимиру этим компонентом, даже, как-то удавалось запускать импорт из WordPress в MODX. Надеюсь, он нам расскажет, как это сделать.

А теперь о развитии

  1. 1990 рублей - это не окончательная стоимость компонента, по мере развития стоимость будет только повышаться. Готово!
  2. Компонент будет расширяться до парсера HTML контента. Готово!
  3. Есть идея совмещения типов парсера (RSS лент и HTML контента). К примеру, в RSS лентах всегда присутствует ссылка на полную статью. В планах сделать так, чтобы воспользовавшись этим полем со ссылкой, передавать задание парсинга из RSS ленты в соседнее задание, которое настроено именно на этот HTML контент. Естественно, данная идея будет реализована только после того, как реализуется сам тип заданий «HTML контент». Готово!
  4. Будет внедрена поддержка ms2Gallery, UserFiles2, modClassVar. Что ещё?
  5. Если есть интересные идеи развития компонента - высказывайтесь.