Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2015 12:44:05

malkir
Зарегистрирован: 2015-07-14
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше

Есть код, он работает нормально но явно не правильно. В силу отсутствия опыта и знаний прошу помочь с правильным написанием кода. Сам код парсит RSS новости и создает уведомление в виде окна.

#!/usr/bin/env python3
import csv
import urllib.request
from bs4 import BeautifulSoup
from easygui import *
import datetime
import time
now_time = datetime.datetime.now()
cur_minutes = now_time.minute
while True:
    def get_html(url):
        response = urllib.request.urlopen(url)
        return response.read()
    def parse(html):
        soup = BeautifulSoup(html)
        telo = soup.find('channel')
        projects =[]
        for item in telo.find_all('item'):
            for wer in item.find_all('wf:expiry'):
                time_end = wer.text[-8:-5]
                projects.append({
                  'Событие' : item.title.text ,
                  'Время окончания' : time_end + ' минут'
                 })
        return projects
    def main():
        msgbox ( parse(get_html('http://content.warframe.com/dynamic/rss.php')), title ='Сигнал')
    if __name__ == '__main__':
        main()
    
    stop = cur_minutes + 5
    while cur_minutes < stop:
        now_time = datetime.datetime.now()
        cur_minutes = now_time.minute
Вот вопрос как обойтись без бесконечного цикла (мне кажется это не совсем правильный способ). И второй как или чем сделать вывод в виде всплывающего уведомления а не целого окна (желательно чтобы основу можно было разместить в трей).

Офлайн

#2 Окт. 8, 2015 00:06:43

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше

без него никак и это нормально, просто оформить нужно по человечески. Весь функционал перенесите в функцию main так, что бы она была действительно главной функцией - сейчас это явно не так. Сделайте таким образом что бы в этом модуле был сверху импорт, потом определения функций, и в конце строчка

if __name__ == '__main__':
        main()
т.е. логически работу модуля сгруппируйте коректно.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Окт. 8, 2015 07:56:45

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше

измените строчку

soup = BeautifulSoup(html)
на
soup = BeautifulSoup(html, 'lxml')
и если нужно установите модуль lxml

и исправте импорт
from easygui import msgbox
не правильно указывать *

Отредактировано Vigi (Окт. 8, 2015 08:02:37)

Офлайн

#4 Окт. 8, 2015 14:43:01

malkir
Зарегистрирован: 2015-07-14
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше


JOHN_16
Сделал так, вроде оно.

#!/usr/bin/env python3
import csv
import urllib.request
from bs4 import BeautifulSoup
from easygui import msgbox
import datetime
import time
while True:
    def delay ():
        now_time = datetime.datetime.now()
        cur_minutes = now_time.minute
        stop = cur_minutes + 5
        while cur_minutes < stop:
            now_time = datetime.datetime.now()
            cur_minutes = now_time.minute
    def get_html(url):
        response = urllib.request.urlopen(url)
        return response.read()
    def parse(html):
        soup = BeautifulSoup(html)
        telo = soup.find('channel')
        projects =[]
        for item in telo.find_all('item'):
            for wer in item.find_all('wf:expiry'):
                time_end = wer.text[-8:-5]
                projects.append({
                  'Событие' : item.title.text ,
                  'Время окончания' : time_end + ' минут'
                 })
        return projects
    def main():
        msgbox ( parse(get_html('http://content.warframe.com/dynamic/rss.php')), title ='Сигнал')
    if __name__ == '__main__':
        main()
        delay()    


Vigi
Vigi
и исправте импорт
from easygui import msgbox
не правильно указывать *
Спасибо изменил
А вот зачем
 soup = BeautifulSoup(html, 'lxml')
не понял, можете объяснить?

Офлайн

#5 Окт. 9, 2015 00:46:21

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше

malkir
нет не оно. Вот примерно такая структура:

import ...
def delay():
    ....
def get_html():
    ....
....
def main():
    while True:
        msgbox ( parse(get_html('http://content.warframe.com/dynamic/rss.php')), title ='Сигнал')
        delay()
if __name__ == '__main__':
    main()

Главный смысл в том что у вас есть функция которая выступает в роли единой точки входа программы.
Проблема в вашем случае что вы не сможете импортироват ьсобстыенный модуль - он у вас будет вечно выполняться.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Окт. 9, 2015 00:57:12

malkir
Зарегистрирован: 2015-07-14
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше

JOHN_16
Спасибо, с меня +

Офлайн

#7 Окт. 9, 2015 05:10:09

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Не знаю как реализовать дальше

malkir
А вот зачем
soup = BeautifulSoup(html, ‘lxml’)
не понял, можете объяснить?

прочтите оф доку по супу, там это все прописано, при выборе lxml функция ускорит свое выполнение

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version