使用Universal Feed Parser读取RSS Feed中的扩展元素集合

4 投票
1 回答
588 浏览
提问于 2025-04-11 09:33

有没有办法用Universal Feed Parser来读取一组扩展元素呢?

这是Kuler RSS源的一小段内容:

<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

Universal Feed Parser 对于大多数信息源来说都很好用,但如果你要处理更复杂的信息源,可能可以试试一个叫做 BeautifulSoup 的工具。它是一个用来解析 XML、HTML 和 XHTML 的库,最初是为了抓取网页内容而设计的;结果发现它在处理这类事情上也非常出色。它的文档写得不错,使用起来也很简单明了,所以如果你考虑用其他工具的话,我会推荐这个。

我可能会这样使用它:

>>> 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 格式简直让人崩溃。我尝试为它写解析器,结果变得非常糟糕,真是让人无奈。所以,是的,使用 RSS 信息源可能是与 Kuler 交互的最简单方式。

撰写回答