2011-04-23 64 views
5

我有一段叫做Rss-Aware的软件,我试图使用它。它基本上是桌面馈源检查器,用于检查RSS源是否已更新,并通过Ubuntu的Notify-OSD系统提供通知。如何从Google Reader导出的OPML文件中提取Feed URL?

但是,要知道需要检查的内容,您必须在每个供稿网址之间的换行列表中逐个列出〜/ .rss-aware/rssfeeds.txt文本文件中的供稿网址。例如:

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

...似乎很简单的权利?那么,我想要使用的提要列表将作为OPML文件(这是一种XML)从Google Reader中导出,我不知道如何解析它才输出提要网址。它似乎应该是非常直接的,但我很难过。

如果有人可以在Python或Ruby中提供实现,或者我可以从提示中快速完成,我很乐意。一个bash脚本会很棒。

非常感谢你的帮助,我是一个非常薄弱的​​程序员,很想学习如何做这个基本的解析。

编辑:另外,here is the OPML file我试图从中提取饲料网址。

回答

2

由于它是XML文件,因此您可以使用XPath查询来提取网址。 在XML文件中,它看起来像rss源URL存储在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,这可能会有所帮助。

+0

...你可以在xmlstarlet的bash管道中使用XPath。 – a3nm 2011-04-23 08:50:44

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

有可能使用类似的脚本来创建Feed网址的文件:

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与您的实际用户名。完成!

0

你也可以使用正则表达式。我用下面的搜索和替换正则表达式来我的谷歌阅读器OPML导出转换为HTML的Firefox实时书签导入:

^\s+<outline.*?title="(.*?)".*?xmlUrl="(.*?)".*?htmlUrl="(.*?)".*?/> 
<DT><A FEEDURL="$2" HREF="$3">$1</A> 
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')