2011-04-23 121 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')