8

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

但是,要知道要检查哪些提要,您必须在 ~/.rss-aware/rssfeeds.txt 的文本文件中一个接一个地列出提要 URL,每个提要 URL 之间有换行符。就像是:

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

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

如果有人可以在 Python 或 Ruby 中提供实现,或者我可以在提示下快速完成的事情,我会很高兴。一个 bash 脚本会很棒。

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

编辑:另外,这是我试图从中提取提要网址的 OPML 文件。

4

4 回答 4

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

可以使用类似于以下内容的脚本创建带有提要 URL 的文件:

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

于 2011-10-16T06:35:24.993 回答
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')
于 2015-10-31T12:09:42.120 回答
2

由于它是一个 XML 文件,因此您可以使用XPath查询来提取 url。在 XML 文件中,看起来 rss 提要 url 存储在xmlUrl属性中。XPath 表达式//@xmlUrl将选择该属性的所有值。

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

于 2011-04-23T04:26:41.070 回答
0

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

^\s+<outline.*?title="(.*?)".*?xmlUrl="(.*?)".*?htmlUrl="(.*?)".*?/>
<DT><A FEEDURL="$2" HREF="$3">$1</A>
于 2012-07-09T19:44:53.147 回答