Search
Write a publication
Pull to refresh

Comments 73

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

Articles