如何将RSS源转换回RSS?

5 投票
4 回答
913 浏览
提问于 2025-04-11 09:27

根据feedparser的文档,我可以把一个RSS源转换成一个解析后的对象,方法是这样的:

import feedparser
d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')

但是我找不到任何关于如何反向操作的信息;我想对'd'进行一些处理,然后把结果输出为XML格式:

print d.toXML()

不过在feedparser中似乎没有提供这种方向的功能。我是不是得一个一个地遍历'd'的各种元素,还是说有更快的方法呢?

4 个回答

0

作为制作信息源的一种方法,试试PyRSS2Gen怎么样? :)

我没有使用过FeedParser,但你有没有试过直接用str(yourFeedParserObject)?我常常对一些模块感到惊讶,因为它们有str方法,可以把对象直接输出为文本。

[编辑]刚刚试了一下str()方法,但在这个上面不管用。不过试试看也不错 ;-)

1

如果你想读取一个XML数据源,修改它,然后再输出,可以看看这个Python的主wiki上有一页提到RSS.py这个库,可能正好符合你的需求(它可以读取大部分RSS格式的数据,并且能输出RSS 1.0格式)。不过我没有仔细研究过这个库。

7

下面是一个虽然不是特别优雅,但能正常工作的解决方案——它使用了feedparser来解析信息源,你可以在此基础上修改条目,然后把数据传递给PyRSS2Gen。这个方法保留了信息源中的大部分信息(重要的部分都保留了,不过有些内容需要额外的转换,比如解析后的parsed_feed['feed']['image']元素)。

我把这个做成了一个我正在尝试的小型信息源处理框架的一部分。这个框架可能会对你有帮助(代码量不大,完成后总行数应该少于100行)。

#!/usr/bin/env python
import datetime

# http://www.feedparser.org/
import feedparser
# http://www.dalkescientific.com/Python/PyRSS2Gen.html
import PyRSS2Gen

# Get the data
parsed_feed = feedparser.parse('http://reddit.com/.rss')

# Modify the parsed_feed data here

items = [
    PyRSS2Gen.RSSItem(
        title = x.title,
        link = x.link,
        description = x.summary,
        guid = x.link,
        pubDate = datetime.datetime(
            x.modified_parsed[0],
            x.modified_parsed[1],
            x.modified_parsed[2],
            x.modified_parsed[3],
            x.modified_parsed[4],
            x.modified_parsed[5])
        )

    for x in parsed_feed.entries
]

# make the RSS2 object
# Try to grab the title, link, language etc from the orig feed

rss = PyRSS2Gen.RSS2(
    title = parsed_feed['feed'].get("title"),
    link = parsed_feed['feed'].get("link"),
    description = parsed_feed['feed'].get("description"),

    language = parsed_feed['feed'].get("language"),
    copyright = parsed_feed['feed'].get("copyright"),
    managingEditor = parsed_feed['feed'].get("managingEditor"),
    webMaster = parsed_feed['feed'].get("webMaster"),
    pubDate = parsed_feed['feed'].get("pubDate"),
    lastBuildDate = parsed_feed['feed'].get("lastBuildDate"),

    categories = parsed_feed['feed'].get("categories"),
    generator = parsed_feed['feed'].get("generator"),
    docs = parsed_feed['feed'].get("docs"),

    items = items
)


print rss.to_xml()

撰写回答