Как извлечь URL фида из файла OPML, экспортированного из Google Reader? - PullRequest
6 голосов
/ 23 апреля 2011

У меня есть программа под названием Rss-Aware , которую я пытаюсь использовать. В основном это программа проверки каналов на рабочем столе, которая проверяет, обновляются ли RSS-каналы, и выдает уведомление через систему Notify-OSD Ubuntu.

Однако, чтобы узнать, какие каналы нужно проверять, вы должны перечислить URL-адреса каналов в текстовом файле в ~ / .rss-aware / rssfeeds.txt один за другим в списке с разрывом строки между 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 Я пытаюсь извлечь URL канала из.

Ответы [ 4 ]

4 голосов
/ 16 октября 2011

Я написал парсер списка подписок для этой цели. Он называется 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 своим действительным именем пользователя. Готово!

2 голосов
/ 31 октября 2015

Синтаксический анализ 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')
2 голосов
/ 23 апреля 2011

Поскольку это файл XML, вы можете использовать запрос XPath для извлечения URL-адресов. В файле XML похоже, что URL-адреса RSS-канала хранятся в атрибутах xmlUrl. Выражение XPath //@xmlUrl выберет все значения этого атрибута.

Если вы хотите проверить это в своем веб-браузере, вы можете использовать онлайн-тестер XPath . Если вы хотите выполнить этот запрос XPath в Python, , этот вопрос объясняет, как использовать XPath в Python . Кроме того, в документации lxml есть страница об использовании XPath в lxml , которая может оказаться полезной.

0 голосов
/ 09 июля 2012

Вы также можете использовать регулярное выражение.Я использовал следующее регулярное выражение поиска и замены, чтобы преобразовать мой экспорт OPML из Google Reader в импорт Live-закладок из Firefox HTML:

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