Заголовок

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.

License

YuzuruS/parse-rss

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.

Build Status Download Count

This parser can handle RSS easily without being conscious of the difference of RSS1.0 and RSS2.0 and ATOM. and gets the minimum necessary value.

  1. site name
  2. site url
  3. article title
  4. article url
  5. article description
  6. date that article posted
  7. thumbnail of article

This thumbnail is composed by og:img and img tags included description.

$ php composer.phar update yuzuru-s/parse-rss --dev 
 require __DIR__ . '/../vendor/autoload.php'; use YuzuruS\Rss\Feed; $url = 'http://blog.livedoor.jp/dqnplus/index.rdf'; $ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'; $res = Feed::load($url, $ua, true); echo 'Title:' . $res['channel']['title'] . "\n"; echo 'Link:' . $res['channel']['link'] . "\n"; foreach ($res['item'] as $r) < echo "\t" . 'Article Title:' . $r['title'] . "\n"; echo "\t" . 'Article Description:' . $r['description'] . "\n"; echo "\t" . 'Article Date:' . $r['date'] . "\n"; echo "\t" . 'Article og:img:' . $r['image']['ogimg'] . "\n"; foreach ($r['image']['img'] as $i) < echo "\t\t" . 'Desc:img:' . $i . "\n"; > >
array(2) < 'channel' =>array(2) < 'title' =>string(27) "site name" 'link' => string "site url" > 'item' => array(15) < [0] =>array(5) < 'title' =>string "title" 'link' => string"url" 'date' => string "date" 'description' => string "description" 'image' => array(2) < 'ogimg' =>string(58) "img url" 'img' => array(3) < [0] =>string(58) "img url1" [1] => string(58) "img url2" [2] => string(94) "img url3" > > > [1] => array(5) < . 

You can also enable caching:

Feed::$cacheDir = __DIR__ . '/tmp'; Feed::$cacheExpire = '5 hours';
% vendor/bin/phpunit -c phpunit.xml.dist 

Currently tested with PHP 7.0.0

Copyright (c) 2016 YUZURU SUZUKI. See MIT-LICENSE for further details.

About

This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.

Источник

Все о парсинге RSS лент средствами PHP

Вот только сегодня закончил писать скрипт парсера RSS лент для одного постоянного заказчика и решил поделиться способами и возможностями который нам предлагает язык PHP для этого дела (парсинга RSS). Для начала давайте я скажу о том что такое вообще RSS, вдруг кто-то из вас еще не знает. Сочинять сам не буду, а просто процитирую википедию:

RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами.

То есть это по сути XML (кто незнает что это идем в википедию и читаем), а XML как нам известно хорошо структурированный документ. Я клоню к тому что если в RSS есть открывающий тег, то должен быть и закрывающий (например: ), иначе это не RSS. Думаю на данном этапе суть ясна: нам нужно получить информацию заключенную между тегами. Любая RSS лента имеет заголовок заключенный между тегами и сам текст статьи заключенный между тегами , именно их нам и нужно спарсить.

Теперь расскажу о способах написания RSS парсера и что предлагает нам PHP для реализации.

SimpleXML – это расширение для PHP5 устанавливаемое в него по умолчанию, представляет самый простой и элегантный способ обработки XML (соответственно и RSS) файлов. Это и наиболее предпочтительный способ, но он стал доступным только в 5 версии PHP. Тут нет ничего проще, данный код наглядно показывает как просто парсить RSS ленты средствами SimpleXML:

 $url = 'rss.xml'; //адрес RSS ленты $rss = simplexml_load_file($url); //Интерпретирует XML-файл в объект //цикл для обхода всей RSS ленты foreach ($rss->channel->item as $item) { echo '

'.$item->title.'

'
; //выводим на печать заголовок статьи echo $item->description; //выводим на печать текст статьи } ?>

Данный код выведет заголовки и тексты статей из RSS ленты. Просто ведь? Этим SimpleXML и привлекает. Дальше вам нужно будет только правильно распорядиться полученными данными, записать в базу или еще куда-нибудь.
Способ 2 – XML Parser Functions

XML Parser Functions - это стандартные функции PHP для работы с XML доступные начиная c 4-ой версии PHP. Тоже нет ничего сложного, правда в отличие от SimpleXML совсем не элегантно. Продемонстрирую пример:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
 $url = 'rss.xml'; //адрес RSS ленты $xml = xml_parser_create(); //создаёт XML-разборщик xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); //устанавливает опции XML-разборщика xml_parse_into_struct($xml, file_get_contents($url), $element, $index); //разбирает XML-данные в структуру массива xml_parser_free($xml); //освобождает XML-разборщик $count = count($index["TITLE"])-1; //число проходов цикла. for ($i=0; $i  $count; $i++) { echo '

'.$element[$index["TITLE"][$i+1]]["value"].'

'
; //выводим на печать заголовок статьи echo $element[$index["DESCRIPTION"][$i+1]]["value"]; //выводим на печать текст статьи } ?>

Вот таким образом мы получаем интересующие нас содержимое элементов RSS. Но тут уже нужно разобраться с массивами которые создает XML разборщик.
Способ 3 – Написать RSS парсер самому

Например я делал именно так, когда не знал про существование SimpleXML и XML Parser Functions. Приведу небольшой пример парсинга RSS обычным процедурным PHP кодом, тут за парсинг отвечает функция preg_match_all(), которая выполняет глобальный поиск шаблона в строке. Данный пример не совершенен и парсит только титлы и дескрипшены у RSS:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 $url = 'rss.xml'; //адрес RSS ленты $rss = @file_get_contents($url); //получаем содержимое RSS лент в виде одной строки if ($rss) { preg_match_all("/title>[^>]+>/", $rss, $title); //парсим титлы preg_match_all("/[^/", $rss, $description); //парсим дескрипшены $count = count($title[0])-1; //число проходов цикла. for ($i=0; $i  $count; $i++) { echo '

'.substr($title[0][$i+1], 6, -8).'

'
; //выводим на печать заголовок статьи echo substr($description[0][$i], 13, -14); //выводим на печать текст статьи } } else { echo 'Ошибка парсинга '.$url.''
; //выводим ошибку если file_get_contents() вернула false } ?>

Таким же способом можно и отпарсить остальные элементы RSS ленты, главное написать правильно регулярку.

На этих трех способах мы и остановимся, еще есть наверняка множество сторонних скриптов и классов в PHP для парсинга XML, например magpieRSS у которого проблемы с кодировкой при парсинге и решить ее у меня не получилось, да собственно не очень то и хотелось, когда есть SimpleXML и XML Parser Functions. Вот кстати о проблемах с кодировкой мы сейчас и поговорим…
Проблемы с кодировкой

RSS ленты как правило находятся в кодировке UTF-8, при парсинге русского текста тремя способами описанными выше, нам на экран выводятся кракозябры. Все потому, что тест к нам приходит в кодировке UTF-8. Для того что бы вывести нормальные РУССКИЕ буквы нужно перекодировать спарсеный текст из кодировки UTF-8 в Windows-1251. Для этих целей в PHP существует функция iconv(), но она доступна не на всех серверах и чтобы избежать дальнейших проблем с вашим RSS парсером советую использовать самописную функцию перекодировки. Вникать в тонкости кодировок и разбираться как из одной кодировки получается другая думаю вам не хочется, так же не хотелось и мне. Немного погуглив я нашел замечательную функцию перекодировки из UTF-8 в Windows-1251 и обратно, предоставляет ее некий товарищ E64F. Возможно конечно он тоже ее где-то слямзил, но это не так важно, важно то что она мне очень понравилась по сравнению с другими нагуглеными функциями. Выкладываю функцию и пример ее использования:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
 echo utf8_convert($str, "w"); //перекодирует $str из UTF-8 в Windows-1251 и выведет на экран { static $conv = ''; if (!is_array($conv)) { $conv = array(); for ($x=128; $x  143; $x++) { $conv['utf'][] = chr(209) . chr($x); $conv['win'][] = chr($x + 112); } for ($x=144; $x 191; $x++) { $conv['utf'][] = chr(208) . chr($x); $conv['win'][] = chr($x + 48); } $conv['utf'][] = chr(208) . chr(129); $conv['win'][] = chr(168); $conv['utf'][] = chr(209) . chr(145); $conv['win'][] = chr(184); } if ($type == 'w') { return str_replace($conv['utf'], $conv['win'], $str); } elseif ($type == 'u') { return str_replace($conv['win'], $conv['utf'], $str); } else { return $str; } } ?>

Функция utf8_convert() принимает 2 параметра: $str – наша строка которую нужно перекодировать и $type – в какую кодировку нужно кодировать (“w” – из utf в win, “u” – из win в utf). Как это применить к нашим 3-м способам парсинга RSS думаю разберетесь, если хоть немного знаете PHP.

Вот на этом пожалуй и закончим. Удачного парсинга !

Источник

Читайте также:  Опциональный аргумент функции python
Оцените статью