【问题标题】:How do you extract feed urls from an OPML file exported from Google Reader?如何从从 Google Reader 导出的 OPML 文件中提取提要 URL?
【发布时间】:2011-08-11 07:57:20
【问题描述】:

我正在尝试使用一个名为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 脚本会很棒。

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

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

【问题讨论】:

    标签: python xml parsing bash opml


    【解决方案1】:

    由于它是一个 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 可能会有所帮助。

    【讨论】:

    • ... 您可以在带有 xmlstarlet 的 bash 管道中使用 XPath。
    【解决方案2】:

    我为此目的编写了一个订阅列表解析器。它被称为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 替换为您的实际用户名即可。完成!

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案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')
        

        【讨论】:

          猜你喜欢
          • 2013-07-12
          • 2011-01-05
          • 2017-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多