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

时间:2011-04-23 02:33:57

标签: python xml parsing bash opml

我有一个名为Rss-Aware的软件,我正在尝试使用它。它基本上是桌面反馈检查器,用于检查RSS源是否更新,并通过Ubuntu的Notify-OSD系统发出通知。

但是,要知道要检查哪些Feed,您必须在〜/ .rss-aware / rssfeeds.txt中的文本文件中依次列出每个Feed网址之间的换行符列表中的Feed网址。类似的东西:

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

......看起来很简单吧?好吧,我想要使用的Feed列表是从Google Reader导出的OPML文件(它是一种XML),我不知道如何解析它只是输出feed urls。看起来它应该很直接但我很难过。

如果有人能用Python或Ruby提供实现,或者我可以从提示中快速完成某些操作,我会很高兴。 bash脚本会很棒。

非常感谢你的帮助,我是一个非常弱的程序员,并且很想学习如何进行这种基本的解析。

编辑:此外,here is the OPML file我正在尝试从中提取Feed网址。

4 个答案:

答案 0 :(得分:4)

我为此目的编写了一个订阅列表解析器。它被称为listparser,它是用Python编写的。我刚测试了你的OPML文件,它似乎完美地解析了文件。它还可以提供您的Feed标签。

如果您曾经使用过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替换为您的实际用户名即可。完成!

答案 1 :(得分:2)

由于它是一个XML文件,您可以使用XPath查询来提取网址。   在XML文件中,rss订阅源网址似乎存储在xmlUrl属性中。 XPath表达式//@xmlUrl将选择该属性的所有值。

如果您想在网络浏览器中对此进行测试,可以使用online XPath tester。如果要在Python中执行此XPath查询,请this question explains how to use XPath in Python。此外,lxml文档的a page on using XPath in lxml可能会有所帮助。

答案 2 :(得分:2)

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')

答案 3 :(得分:0)

你也可以使用正则表达式。我使用以下搜索和替换正则表达式将我的Google Reader OPML导出转换为Firefox HTML实时书签导入:

^\s+<outline.*?title="(.*?)".*?xmlUrl="(.*?)".*?htmlUrl="(.*?)".*?/>
<DT><A FEEDURL="$2" HREF="$3">$1</A>