Чтение коллекций расширенных элементов в RSS-канале с помощью универсального анализатора каналов - PullRequest
4 голосов
/ 28 октября 2008

Есть ли способ прочитать коллекцию элементов расширения с помощью Универсальный анализатор подачи ?

Это всего лишь небольшой фрагмент RSS-ленты Kuler:

<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?

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

1 Ответ

3 голосов
/ 28 октября 2008

Универсальный анализатор каналов действительно хорош для большинства каналов, но для расширенных каналов вы можете попробовать что-то под названием 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, вы можете быть совершенно уверены, что они не будут достаточно сильно меняться, чтобы сломать ваше приложение (то есть это достаточно надежный источник).

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

...