2011-04-23 1 views
5

제가 사용하려고하는 Rss-Aware이라는 소프트웨어가 있습니다. 기본적으로 RSS 피드가 업데이트되었는지 확인하고 Ubuntu의 Notify-OSD 시스템을 통해 알림을 제공하는 데스크톱 피드 검사기입니다.Google 리더에서 내 보낸 OPML 파일에서 피드 URL을 어떻게 추출합니까?

그러나 확인해야 할 피드를 확인하려면 ~/.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 피드 URL을 추출하려고합니다.

답변

2

XML 파일이기 때문에 XPath 쿼리를 사용하여 URL을 추출 할 수 있습니다. 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

4

이 바로 목적을 위해 구독 목록 파서를 작성했습니다. listparser이라고하며 파이썬으로 작성되었습니다. 난 그냥 OPML 파일을 테스트하고, 그것은 완벽하게 파일을 구문 분석하는 것 같습니다. 또한 피드의 라벨을 사용할 수있게 해줍니다. 혹시 feedparser을 사용했다면

, 인터페이스는 잘 알고 있어야합니다 : 그냥 USERNAME을 대체

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

:

>>> 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로 파일을 만들 수 있어요 실제 사용자 이름으로 끝난!

0

또한 정규식을 사용할 수도 있습니다. 나는 파이어 폭스 HTML 라이브 북마크 가져 오기에 내 구글 리더 OPML 내보내기 변환하려면 다음 검색 및 바꾸기 정규식을 사용 :

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