Как извлечь URL фида из файла OPML, экспортированного из Google Reader?

У меня есть программа под названием 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 канала.

python,xml,parsing,bash,opml,

6

Ответов: 4


Я написал парсер списка подписки для этой цели. Он называется 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 + '
')
f.close()

Просто замените USERNAMEсвое фактическое имя пользователя. Готово!


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

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


Синтаксический анализ 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')

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

^s+<outline.*?title="(.*?)".*?xmlUrl="(.*?)".*?htmlUrl="(.*?)".*?/>
<DT><A FEEDURL="$2" HREF="$3">$1</A>
python, xml, парсинг, bash, opml,
Похожие вопросы