Как стать автором
Обновить

Комментарии 73

<link title="" type="application/rss+xml" rel="alternate" href="http://habrahabr.ru/rss/.../"/>
Построчно парсить на пайтоне- такого я еще не видел.
А качать wget'ом видели?
Почему бы не использовать urllib и lxml для парсинга RSS, что более удобно, нежели построчно читать на Python…
Можно, а я хотел сам сделать от и до. А если человеку понравится… а такие уже есть — не надо ничего дополнительно устанавливать, просто скопировать
К счастью, оба модуля являются стандартными для Python =)
хм… у меня lxml не было
Если память не изменяет, нынче он включен в состав Python как ElementTree.
НЛО прилетело и опубликовало эту надпись здесь
Что ж, память мне изменяет :)
Скорее наоборот, да: lxml aims to provide a Pythonic API by following as much as possible the ElementTree API.
Ну os.* же вы используете, а не пишите модули на ассембле для посекторного чтения с винта и запросов к хабру через порты сетевой карты :)
Проблемы от подобных статей не только в том, что они засоряют интернет.
Человеку, действительно, может понравиться, и он возьмёт на вооружение представленные в статье подходы или код, и плохого кода в мире станет ещё больше.
НЛО прилетело и опубликовало эту надпись здесь
Можно и главную парсить, если мозги с RSS несовместимы, как у меня :)
спонсор топика МАТЬ МОЯ ЖЕНЩИНА!!!
Не надо лазить самому в интернет если занят другими делами. Выскочила табличка — ага… не интересно! Выскочила снова — о… а это можно почитать! Я не претендую на премию — мне интересно было сделать и показать.
В этой статье, традиционно для Хабра, плохо ВСЁ.
От подхода до «while(1)».
Вы обижаете питон.
Это php-код на Питоне, простите.
За что так PHP? DOM+XPath заменят 90% кода этого творения в несколько строк. А вызов notify-send через system он и в Африке вызов.
К libnotify есть биндинги.
Не нашёл, да ладно, в этой задаче не критично.
Я про code styling говорил.
В PHP его вообще нет :)
это аттрибут программиста, а не языка, в чем можно лишний раз убедиться из этой статьи
RLY!!! Ваш URL намекает…
Чем именно плох код? Он делает именно то, что нужно, ничего лишнего не напичкано.
Код плох тем, что в нём практически каждая строка написана не так, как надо писать на питоне.
Кроме того, код решает неправильную задачу неправильным способом.
Питон сам по себе минималистический язык, где всё просто, и ваша програмка должна быть простенькая, потом её приятно читать. Вы посмотрите в сторону выше упомянутых библиотек лхмл и урллиб2. Поверьте, меньше гемороя, больше спокойствия.
Драть HTML с помощю wget, потому, что вгет это умеет, и парсить что-то по строчкам, ето жесть!

Давайте напишем питоновский скрипт а из него будем вызывать PHP функцию file_get_contents?
Следующий этап — скачка и парсинг рсса тем же lxml или чем-нибудь встроенным. Следующий — парсинг его feedparser'ом. Следующий — использование рсс-ридера вместо написания ненужного кода.
Только вот перед тем, как менять стрингметоды и os.system на lxml и урллиб, придётся всё-таки прочитать хотя бы tutorial и узнать, как же пишут на питоне.
А ну да, тоже мелочь…
использование рсс-ридера вместо написания ненужного кода.

Сколько ни пробовал RSS-ридеров, но ни один не прижился. Главная причина — куча ни то что не нужной, а мешающей функциональности при отсутствии нужной. А парсить ленту хабра или его главную — технической разницы не вижу.
> А парсить ленту хабра или его главную — технической разницы не вижу.

Бывает.
Я как-то думал, что RSS это тоже подмножество SGML и техника парсинга одна и та же.
Бывает.
RSS это XML, а парсить XML можно проще, чем любой другой SGML.
Вы гарантируете, что RSS на хабре будет всегда, хотя бы, well formed или мне надо доверяться ТМ в этом так же, как и в том, что HTML на главной будет всегда валидный?
Я не рассматриваю клинические случаи.
В случае с python, да, согласен признать вашу правоту — XML проще парсить.
Это проще везде, где есть DOM-парсеры.
Ну т.е. на питоне-то как раз без разницы, lxml и из хтмля DOM сделает.
Техника парсинга 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
— где он должен лежать
— какая это строчка
— куда эти файлы (setup.py и, скажем, habramonitor.py ) закачивать

25% моих проблем на будущее вы решили :)
> Имхо, оптимальный баланс — скопипастил исходники или скачал файл и всё работает.

Копипастят исходники, скачивают файлы нубы. Люди в теме ставят нужные пакеты через aptitude, easy_install и pip, преимущественно в virtualenv. А другие люди в теме подготовливают эти пакеты.

> скрипт, сделанный для себя
Если скрипт сделан для себя, то обсуждать особого смысла нет — вы делаете, как вам больше нравится в рамках вашего опыта. Если для других — правильный путь сделать distutitls пакет и прописать в нём зависимости.
> Копипастят исходники, скачивают файлы нубы
Скажите это гентушникам)… которые неделями могут с этими делами капаться
При чём тут гентушники, мы говорим о принятом в python-мире распространении программ.
Если есть исходники, но нет пакета, то я скачаю исходники лучше. Если решу поделиться, то предоставлю исходники и инструкции для таких же нубов :), а если у людей в теме будет желание, то на базе моих исходников они сделают пакет — разделение труда, личный вклад в open source и всё такое :) Просто разбираться с системами управления пакетами нет желания, один пробовал сделать пакет nginx+passenger — так толком ничего и не получилось, не осилил :(
В моём дистре и feedparser есть.
А если вы про setup.py не знаете (о нём написано в официальной доке с очевидным названием), вам не надо распространять питоний софт.
А я распространять не собираюсь, может когда-то решу поделиться своими наработками где-нить на битбакете — кому понравится обойдутся и без сетапа, или пришлют патч с сетапом.
Бывает.
Поставьте.
Автор видимо не знает про то, что у хабра есть rss, и что наверняка существует апплет для гнома для высвечивания RSS. Да даже если апплет не существует, то парсить сайт при существующем RSS это жесть. А если в хабре шаблон поменяют — все отвалится?
Мало того, в RSS показываются топики с замочком, с wget-ом он их не увидит.
#!/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"


… так лучше? Осн. часть
Вы растёте прямо на глазах

...
posted = datetime.datetime(*entry['updated_parsed'][:6]).strftime("%d.%m.%Y %H:%M")
...
posted = time.strftime("%d.%m.%Y %H:%M", entry['updated_parsed'])
Может, я чего-то не понимаю, но вроде как в 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'))
И db.close() в конце.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации