如何从Google Reader导出的OPML文件中提取订阅网址?

8 投票
5 回答
6319 浏览
提问于 2025-04-16 16:16

我有一个叫做 Rss-Aware 的软件,想要使用它。这个软件基本上是一个桌面订阅源检查工具,它会检查RSS订阅源是否有更新,并通过Ubuntu的Notify-OSD系统给出通知。

不过,要知道检查哪些订阅源,你需要把订阅源的网址列在一个文本文件里,路径是 ~/.rss-aware/rssfeeds.txt,每个网址之间要用换行符分开,像这样:

http://example.com/feed.xml
http://othersite.org/feed.xml
http://othergreatsite.net/rss.xml

...听起来很简单,对吧?但是我想用的订阅源列表是从Google Reader导出的OPML文件(这是一种XML格式),我完全不知道怎么解析这个文件,只提取出订阅源的网址。看起来应该很简单,但我却搞不定。

如果有人能给我一个用Python或Ruby实现的例子,或者其他我可以快速在命令行上运行的方案,那就太好了。一个bash脚本也很不错。

非常感谢你的帮助,我的编程水平很差,希望能学会如何进行这个基本的解析。

编辑:另外,这是我想提取订阅源网址的OPML文件

5 个回答

3

因为这是一个XML文件,你可以用一种叫做XPath的查询方式来提取网址。在这个XML文件里,rss源的网址是存放在xmlUrl这个属性里的。使用XPath表达式//@xmlUrl可以选中所有这个属性的值。

如果你想在浏览器里测试一下,可以使用一个在线XPath测试工具。如果你想在Python中执行这个XPath查询,这个问题解释了如何在Python中使用XPath。另外,lxml的文档里有关于在lxml中使用XPath的页面,可能会对你有帮助。

4

解析XML(可扩展标记语言)非常简单,实施起来也很顺利,对我来说效果很好。

from xml.etree import ElementTree
def extract_rss_urls_from_opml(filename):
    urls = []
    with open(filename, 'rt') as f:
        tree = ElementTree.parse(f)
    for node in tree.findall('.//outline'):
        url = node.attrib.get('xmlUrl')
        if url:
            urls.append(url)
    return urls
urls = extract_rss_urls_from_opml('your_file')
5

我写了一个订阅列表解析器,专门用来处理这个问题。它叫做 listparser,是用Python写的。我刚刚测试了你的OPML文件,结果发现它能完美解析这个文件。而且,它还会让你的订阅源标签变得可用。

如果你用过feedparser,这个界面应该会让你觉得很熟悉:

>>> import listparser as lp
>>> d = lp.parse('https://dl.dropbox.com/u/670189/google-reader-subscriptions.xml')
>>> len(d.feeds)
112
>>> d.feeds[100].url
u'http://longreads.com/rss'
>>> d.feeds[100].tags
[u'reading']

你可以用类似下面的脚本来创建一个包含订阅链接的文件:

import listparser as lp
d = lp.parse('https://dl.dropbox.com/u/670189/google-reader-subscriptions.xml')
f = open('/home/USERNAME/.rss-aware/rssfeeds.txt', 'w')
for i in d.feeds:
    f.write(i.url + '\n')
f.close()

只需把 USERNAME 替换成你自己的用户名就可以了。完成!

撰写回答