2008-10-27 10 views
4

Есть ли способ прочитать коллекцию элементов расширения с помощью Universal Feed Parser?Чтение наборов расширенных элементов в RSS-канале с помощью универсального подающего анализатора

Это лишь короткий отрывок из Kuler RSS Feed:

<channel> 
    <item> 
    <!-- snip: regular RSS elements --> 
    <kuler:themeItem> 
     <kuler:themeID>123456</kuler:themeID> 
     <!-- snip --> 
     <kuler:themeSwatches> 
     <kuler:swatch> 
      <kuler:swatchHexColor>FFFFFF</kuler:swatchHexColor> 
      <!-- snip --> 
     </kuler:swatch> 
     <kuler:swatch> 
      <kuler:swatchHexColor>000000</kuler:swatchHexColor> 
      <!-- snip --> 
     </kuler:swatch> 
     </kuler:themeSwatches> 
    </kuler:themeItem> 
    </item> 
</channel> 

Я попытался следующие: только

>>> feed = feedparser.parse(url) 
>>> feed.channel.title 
u'kuler highest rated themes' 
>>> feed.entries[0].title 
u'Foobar' 
>>> feed.entries[0].kuler_themeid 
u'123456' 
>>> feed.entries[0].kuler_swatch 
u'' 

feed.entries[0].kuler_swatchhexcolor возвращает последний kuler:swatchHexColor. Есть ли способ получить все элементы с помощью feedparser?

Я уже работал над проблемой, используя мини-диск, но я хотел бы использовать Universal Feed Parser, если это возможно (из-за очень простого API). Может ли он быть расширен? Я ничего не нашел в документации, поэтому, если у кого-то больше опыта работы с библиотекой, пожалуйста, сообщите мне.

ответ

3

Универсальный фид Parser действительно хорош для большинства каналов, но для расширенных каналов вы можете попробовать что-то под названием BeautifulSoup. Это библиотека синтаксического анализа XML/HTML/XHTML, которая изначально предназначена для экранирования скриншотов; Оказывается, это также блестяще для такого рода вещей. Документация довольно хорошая, и у нее есть понятный API, поэтому, если вы думаете о том, чтобы использовать что-либо еще, я рекомендую это.

я бы, вероятно, использовать его как это:

>>> import BeautifulSoup 
>>> import urllib2 

# Fetch HTML data from url 
>>> connection = urllib2.urlopen('http://kuler.adobe.com/path/to/rss.xml') 
>>> html_data = connection.read() 
>>> connection.close() 

# Create and search the soup 
>>> soup = BeautifulSoup.BeautifulSoup(html_data) 
>>> themes = soup.findAll('kuler:themeitem') # Note: all lower-case element names 

# Get the ID of the first theme 
>>> themes[0].find('kuler:themeid').contents[0] 
u'123456' 

# Get an ordered list of the hex colors for the first theme 
>>> themeswatches = themes[0].find('kuler:themeswatches') 
>>> colors = [color.contents[0] for color in 
... themeswatches.findAll('kuler:swatchhexcolor')] 
>>> colors 
[u'FFFFFF', u'000000'] 

Таким образом, вы, вероятно, может получить представление, что это очень крутая библиотека. Было бы не слишком хорошо, если бы вы разбирали какой-либо старый RSS-канал, но поскольку данные взяты из Adobe Kuler, вы можете быть уверены, что это не будет достаточно для того, чтобы разорвать ваше приложение (т. Е. Это достаточно надежный источник).

Хуже всего пытается проанализировать проклятый формат Adobe .ASE. Я попробовал написать парсер для него, и это стало действительно ужасно, очень быстро. Ug. Итак, да, RSS-каналы, вероятно, самый простой способ взаимодействия с Kuler.

+0

Спасибо, я тоже это проверю. API кажется немного проще, чем с мини-домом: я бы выбрал find/findAll vs. getElementsByTagName в любой день :) – 2008-10-28 09:25:29