# Κέντρο Ανοικτών Διαδικτυακών Μαθημάτων Mathesis των Πανεπιστημιακών Εκδόσεων Κρήτης (ΠΕΚ) # http://mathesis.cup.gr # # Εισαγωγή στην Python Διδάσκων Καθ. Νίκος Αβούρης # http://mathesis.cup.gr/courses/course-v1:ComputerScience+CS1.1+2017_T2/about # Εβδομάδα 6η - Μάθημα 21ο - Ασκήσεις επανάληψης # https://trinket.io/python3/18cd6fd326 # Λύση της τελικής εργασίας «Ανάκτηση δεδομένων από τη diavgeia.gov.gr» # Copyright (C) 2017 Χρήστος Ιωσηφίδης chiossif@yahoo.com # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . import re import urllib.request import urllib.error import time as timelib arxes = {} months = { "Jan": "Ιανουαρίου", "Feb": "Φεβρουαρίου", "Mar": "Μαρτίου", "Apr": "Απριλίου", "May": "Μαΐου", "Jun": "Ιουνίου", "Jul": "Ιουλίου", "Aug": "Αυγούστου", "Sep": "Σεπτεμβρίου", "Oct": "Οκτωβρίου", "Nov": "Νοεμβρίου", "Dec": "Δεκεμβρίου" } days = { "Sun" : "Κυριακή", "Mon" : "Δευτέρα", "Tue" : "Τρίτη", "Wed" : "Τετάρτη", "Thu" : "Πέμπτη", "Fri" : "Παρασκευή", "Sat" : "Σάββατο" } def rss_feed(url): #3 μονάδες * ''' Άνοιγμα του rss feed, :param url: η διεύθυνση του rss feed. Αυτή η συνάρτηση δημιουργεί ένα αρχείο με τα περιεχόμενα του rss_feed με όνομα την διεύθυνση του rss feed. Καλεί την συνάρτηση process_feed η οποία επιλέγει και τυπώνει περιεχόμενο Προσπαθήστε να κάνετε try/except τα exceptions HTTPError και URLError. ''' #σύμφωνα με την ανακοίνωση της διαύγειας τα rss feeds είναι στο ίδιο url/rss url += r"/rss" req = urllib.request.Request(url) try: with urllib.request.urlopen(req) as response: html = response.read().decode() filename = url[url.find("//")+2:].replace("/","_")+".txt" with open(filename, "w", encoding="utf-8") as p: p.write(html) except urllib.error.HTTPError as e: print(e.code) print(e.readline()) return 0 except urllib.error.URLError as e: print(e) if hasattr(e, 'reason'): # χωρίς σύνδεση ιντερνετ print('Αποτυχία σύνδεσης στον server') print('Αιτία: ', e.reason) return 0 else: if ( process_feed(filename)) : return 1 else : return 0 def process_date(date): #2 μονάδες ''' η συνάρτηση διαμορφώνει την ελληνική ημερομηνία του rss feed: Στο rss αρχείο η ημερομηνία είναι της μορφής: Wed, 14 Jun 2017 17:21:16 GMT Θα πρέπει να διαμορφώνεται σε ελληνική ημερομηνία, πχ: Τετ, 14 Ιουν 2017 :param date: :return: η ελληνική ημερομηνία ''' # ημέρα day = date.split(',')[0] # ημερομηνία mdate = re.findall(r" [0-9]{2} ",date)[0].strip(' ') mmont = re.findall(r" [A-Z][a-z]{2} ",date)[0].strip(' ') myear = re.findall(r" [0-9]{4} ",date)[0].strip(' ') # αποτέλεσμα σε αλφαριθμητικό result = days[day]+", "+mdate+"ης "+months[mmont]+" "+myear # # Επέκταση της συνάρτησης με προσθήκη της τοπικής ώρας :-) # # εξαγωγή και διόρθωση ώρας time = re.findall(r"[0-9]{2}:[0-9]{2}:[0-9]{2}",date)[0] hours = int(time.split(':')[0]) # η ώρα σε GMT minutes = time.split(':')[1] # τα λεπτά seconds = time.split(':')[2] # και τα δευτερόλεπτα # υπολογισμός τοπικής ώρας - απαιτεί την βιβλιοθήκη time if timelib.daylight: # εάν έχουμε θερινή ώρα offset = timelib.altzone / 60 / 60 # διαφορά θερινής ώρας else: offset = timelib.timezone / 60 / 60 # διαφορά χειμερινής ώρας hours-=offset # προσθήκη ώρας στο αποτέλεσμα result += " και ώρα "+str(int(hours))+":"+minutes+":"+seconds return result def process_feed(filename): #3 μονάδες * ''' συνάρτηση που ανοίγει το αρχείο με το rss feed και τυπώνει την ημερομηνία και τους τίτλους των αναρτήσεων που περιέχει. Xρησιμοποιήστε regular expressions ''' print("process feed", filename) with open(filename, 'r', encoding = 'utf-8') as f: rss = f.read().replace("\n", " ") title = re.findall(r"(.*?)",rss, re.MULTILINE | re.IGNORECASE) date = re.findall(r"(.*?)",rss, re.MULTILINE | re.IGNORECASE) print("ΗΜΕΡΟΜΗΝΙΑ : "+process_date(date[0])) print("+++ "+title[0]+" +++") feeds = [] items = re.findall(r"(.*?)",rss, re.MULTILINE | re.IGNORECASE) for item in items: printline=str(items.index(item)+1) atitle = re.findall(r"(.*?)",item, re.MULTILINE | re.IGNORECASE) if len(atitle)>0: printline+="\t"+atitle[0] adate = re.findall(r"[0-9]{2}/[0-9]{2}/[0-9]{4}",item, re.MULTILINE | re.IGNORECASE) if len(adate)>0: printline+="\t"+adate[0] print (printline) # # Επέκταση της συνάρτησης με επιλογή και εμφάνιση πράξης :-) # while items: epilogh = input("ΕΠΙΛΟΓΗ ΠΡΑΞΗΣ....") if epilogh == "": break elif epilogh.isdigit() and 0(.*?)",items[epilogh-1], re.MULTILINE | re.IGNORECASE) aurl = re.findall(r"(.*?)", items[epilogh-1], re.MULTILINE | re.IGNORECASE) print("Η ΠΡΑΞΗ <"+ atitle[0].rstrip('.') + "> ΤΟΥ ΦΟΡΕΑ <" + title[0].split(" - ",1)[1]+ "> ΒΡΙΣΚΕΤΑΙ ΣΤΟΝ ΣΥΝΔΕΣΜΟ <"+aurl[0]+">.") def search_arxes(arxh): #2 μονάδες ''' Αναζήτηση ονόματος Αρχής που ταιριάζει στα κριτήρια του χρήστη ''' result=[] for key in arxes: if arxh in key: result.append(key) return result def load_arxes(): #2 μονάδες ''' φορτώνει τις αρχές στο λεξικό arxes{} ''' filename="500_arxes.csv" with open(filename, 'r', encoding = 'utf-8') as f: for line in f: (key, val) = line.split(';') arxes[key] = val.rstrip() ######### main ############### ''' το κυρίως πρόγραμμα διαχειρίζεται την αλληλεπίδραση με τον χρήστη ''' load_arxes() while True : arxh = input(50*"^"+"\nΟΝΟΜΑ ΑΡΧΗΣ:(τουλάχιστον 3 χαρακτήρες), ? για λίστα:") if arxh == '': break elif arxh == "?": # παρουσιάζει τα ονόματα των αρχών for k,v in arxes.items(): print (k,v) elif len(arxh) >= 3 : # αναζητάει όνομα αρχής που ταιριάζει στα κριτήρια του χρήστη result = search_arxes(arxh) for r in result: print (result.index(r)+1, r, arxes[r]) while result: epilogh = input("ΕΠΙΛΟΓΗ....") if epilogh == "": break elif epilogh.isdigit() and 0