Comments 73
<link title="" type="application/rss+xml" rel="alternate" href="http://habrahabr.ru/rss/.../"/>
Построчно парсить на пайтоне- такого я еще не видел.
Почему бы не использовать urllib и lxml для парсинга RSS, что более удобно, нежели построчно читать на Python…
Можно, а я хотел сам сделать от и до. А если человеку понравится… а такие уже есть — не надо ничего дополнительно устанавливать, просто скопировать
К счастью, оба модуля являются стандартными для Python =)
Ну os.* же вы используете, а не пишите модули на ассембле для посекторного чтения с винта и запросов к хабру через порты сетевой карты :)
Проблемы от подобных статей не только в том, что они засоряют интернет.
Человеку, действительно, может понравиться, и он возьмёт на вооружение представленные в статье подходы или код, и плохого кода в мире станет ещё больше.
Человеку, действительно, может понравиться, и он возьмёт на вооружение представленные в статье подходы или код, и плохого кода в мире станет ещё больше.
Можно и главную парсить, если мозги с RSS несовместимы, как у меня :)
спонсор топика МАТЬ МОЯ ЖЕНЩИНА!!!
а зачем?
В этой статье, традиционно для Хабра, плохо ВСЁ.
От подхода до «while(1)».
От подхода до «while(1)».
Вы обижаете питон.
Это php-код на Питоне, простите.
Чем именно плох код? Он делает именно то, что нужно, ничего лишнего не напичкано.
Код плох тем, что в нём практически каждая строка написана не так, как надо писать на питоне.
Кроме того, код решает неправильную задачу неправильным способом.
Кроме того, код решает неправильную задачу неправильным способом.
Питон сам по себе минималистический язык, где всё просто, и ваша програмка должна быть простенькая, потом её приятно читать. Вы посмотрите в сторону выше упомянутых библиотек лхмл и урллиб2. Поверьте, меньше гемороя, больше спокойствия.
Драть HTML с помощю wget, потому, что вгет это умеет, и парсить что-то по строчкам, ето жесть!
Давайте напишем питоновский скрипт а из него будем вызывать PHP функцию file_get_contents?
Драть HTML с помощю wget, потому, что вгет это умеет, и парсить что-то по строчкам, ето жесть!
Давайте напишем питоновский скрипт а из него будем вызывать PHP функцию file_get_contents?
Следующий этап — скачка и парсинг рсса тем же lxml или чем-нибудь встроенным. Следующий — парсинг его feedparser'ом. Следующий — использование рсс-ридера вместо написания ненужного кода.
Только вот перед тем, как менять стрингметоды и os.system на lxml и урллиб, придётся всё-таки прочитать хотя бы tutorial и узнать, как же пишут на питоне.
Только вот перед тем, как менять стрингметоды и os.system на lxml и урллиб, придётся всё-таки прочитать хотя бы tutorial и узнать, как же пишут на питоне.
А ну да, тоже мелочь…
использование рсс-ридера вместо написания ненужного кода.
Сколько ни пробовал RSS-ридеров, но ни один не прижился. Главная причина — куча ни то что не нужной, а мешающей функциональности при отсутствии нужной. А парсить ленту хабра или его главную — технической разницы не вижу.
> А парсить ленту хабра или его главную — технической разницы не вижу.
Бывает.
Бывает.
Я как-то думал, что RSS это тоже подмножество SGML и техника парсинга одна и та же.
Бывает.
RSS это XML, а парсить XML можно проще, чем любой другой SGML.
RSS это XML, а парсить XML можно проще, чем любой другой SGML.
Техника парсинга rss это import feedparser; feedparser.parse(url) :)
volch@ubuhost:~$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import feedparser
Traceback (most recent call last):
File "", line 1, in ImportError: No module named feedparser
sudo pip install feedparser
Для себя пойдёт, для публично распространяемого скрипта в исходниках я бы не стал вводить лишние зависимости, требующих ручного удовлетворения. Или оформил бы сам в виде пакета. Правда заморочек бы было наверное… Проще самому парсер на основе стандартных либ написать, имхо.
А я бы стал. А у кого нет возможности поставить feedparser, это его проблемы. А может он python не может поставить, я что теперь должен на C переписать скрипт и распространять его в бинарниках для разных платформ? А вдруг у него деньги на счёте провайдера кончились, мне теперь бегать ему домой приносить содержимое страниц на дискетках? Я считаю, в желании угодить пользователю надо соблюдать оптимальный балланс.
> Или оформил бы сам в виде пакета. Правда заморочек бы было наверное…
Это всего лишь одна строчка в setup.py, install_requires называется.
> Проще самому парсер на основе стандартных либ написать, имхо.
И собрать все грабли, что были пофиксены в фидпарсере за время его развития.
> Или оформил бы сам в виде пакета. Правда заморочек бы было наверное…
Это всего лишь одна строчка в setup.py, install_requires называется.
> Проще самому парсер на основе стандартных либ написать, имхо.
И собрать все грабли, что были пофиксены в фидпарсере за время его развития.
Питон в моём дистре стоит, потому не вопрос. Имхо, оптимальный баланс — скопипастил исходники или скачал файл и всё работает. Бегать не буду, но и тестировать под другими дистрами и осями скрипт, сделанный для себя, тоже.
>Это всего лишь одна строчка в setup.py, install_requires называется.
Если бы я сам разбирался мне нужно было бы, как минимум, узнать:
— что файл называется setup.py
— где он должен лежать
— какая это строчка
— куда эти файлы (setup.py и, скажем, habramonitor.py ) закачивать
25% моих проблем на будущее вы решили :)
>Это всего лишь одна строчка в setup.py, install_requires называется.
Если бы я сам разбирался мне нужно было бы, как минимум, узнать:
— что файл называется setup.py
— где он должен лежать
— какая это строчка
— куда эти файлы (setup.py и, скажем, habramonitor.py ) закачивать
25% моих проблем на будущее вы решили :)
> Имхо, оптимальный баланс — скопипастил исходники или скачал файл и всё работает.
Копипастят исходники, скачивают файлы нубы. Люди в теме ставят нужные пакеты через aptitude, easy_install и pip, преимущественно в virtualenv. А другие люди в теме подготовливают эти пакеты.
> скрипт, сделанный для себя
Если скрипт сделан для себя, то обсуждать особого смысла нет — вы делаете, как вам больше нравится в рамках вашего опыта. Если для других — правильный путь сделать distutitls пакет и прописать в нём зависимости.
Копипастят исходники, скачивают файлы нубы. Люди в теме ставят нужные пакеты через aptitude, easy_install и pip, преимущественно в virtualenv. А другие люди в теме подготовливают эти пакеты.
> скрипт, сделанный для себя
Если скрипт сделан для себя, то обсуждать особого смысла нет — вы делаете, как вам больше нравится в рамках вашего опыта. Если для других — правильный путь сделать distutitls пакет и прописать в нём зависимости.
> Копипастят исходники, скачивают файлы нубы
Скажите это гентушникам)… которые неделями могут с этими делами капаться
Скажите это гентушникам)… которые неделями могут с этими делами капаться
Если есть исходники, но нет пакета, то я скачаю исходники лучше. Если решу поделиться, то предоставлю исходники и инструкции для таких же нубов :), а если у людей в теме будет желание, то на базе моих исходников они сделают пакет — разделение труда, личный вклад в open source и всё такое :) Просто разбираться с системами управления пакетами нет желания, один пробовал сделать пакет nginx+passenger — так толком ничего и не получилось, не осилил :(
В моём дистре и feedparser есть.
А если вы про setup.py не знаете (о нём написано в официальной доке с очевидным названием), вам не надо распространять питоний софт.
Бывает.
Поставьте.
лютый бешеный ппц
Автор видимо не знает про то, что у хабра есть rss, и что наверняка существует апплет для гнома для высвечивания RSS. Да даже если апплет не существует, то парсить сайт при существующем RSS это жесть. А если в хабре шаблон поменяют — все отвалится?
#!/usr/bin/python
#-*- coding:utf-8 -*-
import feedparser
import os
import sys
import datetime
habr = "http://habrahabr.ru/rss"
rss = feedparser.parse(habr)
#print "title: " + rss.feed.title
#print "description: " + rss.feed.description + "\n"
for entry in rss.entries:
newstr = entry.title.split(" / ")
print "Blog: \t" + newstr[0] + "\n" + "Topic: \t" + newstr[1]
# convert the given time format to datetime
posted_datetime = datetime.datetime(
entry['updated_parsed'][0],
entry['updated_parsed'][1],
entry['updated_parsed'][2],
entry['updated_parsed'][3],
entry['updated_parsed'][4],
entry['updated_parsed'][5]
)
posted = posted_datetime.strftime("%d.%m.%Y %H:%M")
print "Date: \t" + posted + "\n"
… так лучше? Осн. часть
Может, я чего-то не понимаю, но вроде как в RSS ленту попадают не все топики, а только те, которые похожи на отложенное в избранное. Поэтому приходится часто заходить на Хабр и смотреть, что пропустил. Может, полная лента все-таки есть — ткните, пожалуйста, ссылкой.
Ваш код оценили на говнокод.ру :)
Ну вот, дождались популяризации python. Теперь наслаждайтесь :)
from feedparser import parse
import shelve
import os
db = shelve.open(os.path.expanduser('~/.habra-notifier.cache'), 'c')
for entry in parse('http://habrahabr.ru/rss').entries:
link = entry.link.encode('utf-8')
if not link in db:
db[link] = 1
os.system('notify-send "%s"' % entry.title.encode('utf-8'))
Sign up to leave a comment.
Оповещение появления нового топика на Хабрахабре с помощью Python