Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

15.2.1. Стандартная библиотека rss

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

Ситуация осложняется еще и тем, что существуют несовместимые версии стандарта; чаще всего используются 0.9,1.0 и 2.0. В общем, подобно производству колбасы, RSS — такая вещь, в детали

которой лучше не вникать.

В дистрибутив Ruby входит стандартная библиотека, понимающая версии стандарта 0.9,1.0 и 2.0. Даже если вы не укажете версию входного документа явно, библиотека попытается определить ее самостоятельно.

Рассмотрим пример. Мы загрузили канал с сайтаи распечатали заголовки нескольких статей из него:

require 'rss'

require 'open-uri'

URL = "http://www.marstoday.com/rss/mars.xml"

open(URL) do |h|

 resp = h.read

 result = RSS::Parser.parse(resp,false)

 puts "Канал: #{result.channel.title}"

 result.iterns.each_with_index do |item,i|

i += 1

puts "#{i} #{item.title}"

 end

end

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

В этой программе мы для удобства воспользовались библиотекой

open-uri
. Подробно мы рассмотрим ее в главе 18, а пока достаточно знать, что она позволяет вызывать метод
open
для URI, как для обычного файла.

Отметим, что канал извлекает из документа анализатор RSS, а наша программа печатает название канала. Кроме того, метод доступа

items
формирует список элементов канала, то есть статей, а мы распечатываем их заголовки.

Понятно, что результат меняется со временем; когда я запускал эту программу, она напечатала вот что:

Title: Mars Today Top Stories

1 NASA Mars Picture of the Day: Lava Levees

2 NASA Mars Global Surveyor TES Dust And Temperature Maps 25 June - 2 July 2006

3 Mars Institute Core Team Arrives at the HMP Research Station on Devon Island

4 Assessment of NASA's Mars Architecture 2007-2016

5 NASA Mars Picture of the Day: Rush Hour

Есть также возможность генерировать документы в формате RSS (листинг 15.5). Для этого нужно инвертировать показанную выше процедуру.

Листинг 15.5. Создание RSS-канала

require 'rss'

feed = RSS::Rss.new("2.0")

chan = RSS::Rss::Channel.new

chan.description = "Feed Your Head"

chan.link = "http://nosuchplace.org/home/"

img = RSS::Rss::Channel::Image.new

img.url = "http://nosuchplace.org/images/headshot.jpg"

img.title = "Y.T."

img.link = chan.link

chan.image = img

feed.channel = chan

i1 = RSS::Rss::Channel::Item.new

i1.title = "Once again, here we are"

i1.link = "http://nosuchplace.org/articles/once_again/"

i1.description = "Don't you feel more like you do now than usual?"

i2 = RSS::Rss::Channel::Item.new

i2.title = "So long, and thanks for all the fiche"

i2.link = "http://nosuchplace.org/articles/so_long_and_thanks/"

i2.description = "I really miss the days of microfilm..."

i3 = RSS::Rss::Channel::Item.new

i3.title = "One hand clapping"

i3.link = "http://nosuchplace.org/articles/one_hand_clapping/"

i3.description = "Yesterday I went to an amputee convention..."

feed.channel.items << i1 << i2 << i3

puts feed

Большая

часть этой программы понятна без слов. Мы создаем канал в формате RSS 2.0 (с пустыми элементами
channel
и
image
), а потом с помощью методов доступа добавляем данные. Элемент
image
ассоциируется с элементом
channel
, а последний — с самим RSS-каналом.

Наконец, мы создаем последовательность статей и помещаем их в канал. Отметим, что необходимо добавлять статьи именно по отдельности. Возникает искушение пойти по более простому пути:

feed.channel. items = [i1,i2,i3]

но такое решение работать не будет. Почему-то в классе

Channel
нет акцессора
items=
. Можно было бы написать
items[0] = i1
и т.д., или то же самое в цикле. Наверное, есть и другие способы добиться нужного результата, но представленное выше решение вполне годится.

У библиотеки

rss
есть еще много возможностей, но не все в данный момент хорошо документированы. Если вы не сможете найти то, что вам нужно, в качестве последнего средства обратитесь к исходным текстам.

Поделиться:
Популярные книги

Похвали меня

Кейт Сара
Любовные романы:
зарубежные любовные романы
5.00
рейтинг книги
Похвали меня

Звезды на приеме у психолога. Психоанализ знаменитых личностей

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

"Княгиня Ольга". Компиляция. Книги 1-19

Дворецкая Елизавета Алексеевна
Княгиня Ольга
Приключения:
исторические приключения
5.00
рейтинг книги
Княгиня Ольга. Компиляция. Книги 1-19

Вавилон - 17 [Вавилон - 17. Нова. Падение башен]

Дилэни Сэмюэль
Фантастика:
научная фантастика
5.00
рейтинг книги
Вавилон - 17 [Вавилон - 17. Нова. Падение башен]

Ошибки богов. Тетралогия

Танков Вячеслав
Ошибки богов
Фантастика:
фэнтези
5.00
рейтинг книги
Ошибки богов. Тетралогия

Золото Вильгельма

Искандер Фазиль Абдулович
Козы и Шекспир
Проза:
современная проза
5.00
рейтинг книги
Золото Вильгельма

Нас ждет Севастополь

Соколов Георгий Владимирович
Проза:
военная проза
советская классическая проза
5.00
рейтинг книги
Нас ждет Севастополь

10 вождей. От Ленина до Путина

Млечин Леонид Михайлович
Документальная литература:
биографии и мемуары
5.20
рейтинг книги
10 вождей. От Ленина до Путина

Шерас

Стародубцев Дмитрий
Фантастика:
фэнтези
6.25
рейтинг книги
Шерас

Неизвестный фактор (Романы)

Нортон Андрэ
Фантастика:
фэнтези
5.00
рейтинг книги
Неизвестный фактор (Романы)

Вершитель

Осадчук Алексей Витальевич
7. Андердог
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Вершитель

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Темная Башня 4 (Колдун и Кристалл)

Кинг Стивен
Фантастика:
боевая фантастика
фэнтези
научная фантастика
8.12
рейтинг книги
Темная Башня 4 (Колдун и Кристалл)