From 20b6d5439e28bc6c75cb07ae0d0c3d4bf30b5694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joonas=20Sepp=C3=A4?= <joasep@utu.fi> Date: Sat, 26 Mar 2022 21:00:57 +0200 Subject: [PATCH] Better news program --- .vscode/launch.json | 14 +++ __pycache__/myNewsClass.cpython-39.pyc | Bin 2122 -> 3897 bytes myNews.py | 9 +- myNewsClass.py | 140 ++++++++++++++++++++++--- 4 files changed, 148 insertions(+), 15 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2a71b20 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Open jsProject.html", + "file": "/Users/joonasseppa/Desktop/Koulu/training/jsProject.html" + } + ] +} \ No newline at end of file diff --git a/__pycache__/myNewsClass.cpython-39.pyc b/__pycache__/myNewsClass.cpython-39.pyc index f6814a0a7a12bd8e8fdc518f1272d3e82e065d54..6f255d5eee68e1ec444027d4c47f68c8a4f9b7e1 100644 GIT binary patch literal 3897 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 delta 1254 zcmdlfcS?XSk(ZZ?fq{YHn8lw&1@4J_GG1m33=Am@DU3M`xr|Yaj372s4pS6U3PTE0 z4s#SUm}ZG$ac4+jPGM<bNMUJaiegP+3TDt`eF-v3lkpadU#O3d-^A@M^^719DCS^b zU|?lnU~pz&U?_ga$iPs;kiwYFR1{Of(9FQdP{NSH)XWH`nISY(lm)^|VTI68Q8oxK zg&j(BKxmNc1jf8Rh?(^z3@My74B`waT;dEM1u5KM9*;OfEn^Ae0;U?qg^aaKCCm$0 zYM8QE7c$l|*D$B>N;0JIWiu4rf*4Z5kirkrTf&ec0HGmjAZ(C@B@8Ko2;Kz7Jb@bK z6d_55+IkkK5o{@Z&5SM#u|H~AOBiZcYFH&1QiLTLQbZ&fQbZw6gNlktGL*1qGfiMD zc0!1xh+~LIfJBP6LDfjYbyXllQpD>)ii(kiAljNr7*eD_F3vMTD6eHJ;aI>~!<Hhw zkg1lvhTVlBmJjS)aKKMsESv}NOyLKp9x+J<0(yiP3opSmr7#3DXv+9a-o<)vvm3h^ zBb#7Ieu0AN<SNcAJD!sKlEj>#)Z)^dlH!-3L{cT};~E^S5aQwJr(miO<Qg366B1k{ z9Fmb)tdN_SSE*10QEa79<vCfD+h%eIw?=&wcS>q;a#3bMNoIcDErwr=3b)vk^Ycnl z^Gd3eLo!kopd5wFVui$<;(Ud?(wrO}g}i))<itFMl>C<g3=9mKT(?*YiZb&`ZgCW) z7M7+KmlWS(PERel#gbK=pLdHjCqFTzxQK^=f#DWwQDR<tY7rBN%~6tCUr|zClvohO z0wOgzqIi?@OY=&KDuYXkGV{`-m`jUtqPUCmb5orm;$TCH*g(1&Go#oOi%K$+b5f&( z3QCi5GK(`3lX6lWAz~{Tio_Tg7=F1sTg8MHrxq2*c;)BkB^JlHq!wqF<QK$v=a=S` z%EXiuC1&Pj=B39JRF-7q=lP|U7Y7vOrxzvW#!Ob=m52pp!Qv25eq`ccWMkxDL?t;G zxtQ1(1(<o5xEOhuc%UjEG#3j86B`o`qXd%~lNloy6Au#)69*#?BL|!{S(eYCUV?!E z;#RPOA%r+cjG2Lf0p!(UP-t;56@mDgY*Au~#g%!<nfZF<nRzMs<;C%-WvO{3#o#b4 u;s<FI1Q8-20;C0EA}BB*ERfl^IBatBQ%ZAE?HC0>WedocJYdgpFaZGbb|Rbr diff --git a/myNews.py b/myNews.py index 2cb67e6..a7c3240 100644 --- a/myNews.py +++ b/myNews.py @@ -1,7 +1,14 @@ from myNewsClass import NewsByCountry print() +number=5 while(True): print("If you need instructions, type 'info'") print("What country do you want news from?: ") - NewsByCountry.callNews(input()) \ No newline at end of file + userInput = input() + if userInput=="exit": + break + number = NewsByCountry.callNews(userInput, number) + #If number -1 is returned, an error has happened + if number == -1: + break \ No newline at end of file diff --git a/myNewsClass.py b/myNewsClass.py index 68346ba..07f1f33 100644 --- a/myNewsClass.py +++ b/myNewsClass.py @@ -1,13 +1,60 @@ -from asyncio.windows_events import NULL import requests import json import textwrap +from urllib.request import urlopen +#import xml.parsers.expat +from xml.dom.minidom import parse, parseString +import xml.etree.ElementTree as ET +import xmltodict class NewsByCountry: - def callNews(countryString): + def callNews(countryString, number): + if(countryString=="iltalehti"): + iltalehtiURL = requests.get("https://www.iltalehti.fi/rss/uutiset.xml") + + iltalehtiDICT = xmltodict.parse(iltalehtiURL.content) + + #MUUTIN TÄSSÄ DICT-FORMAATIN JSON:iksi. Nähtävästi DICT toimii jo samalla tavalla. + #PIDETÄÄN KUITENKIN KOODI TÄSSÄ JOS JSON:ia TARVITSEE! + #iltalehtiJSON = json.dumps(iltalehtiDICT) + #iltalehtiJSONOikea = json.loads(iltalehtiJSON) + + #json.loads MUUTTAA JSON:IN DICTIONARYKSI; siis iltalehtiJSONOikea~iltalehtiDICT + #Tyyppi ei ole täysin sama; toinen on ordered dictionary ja toinen perus dictionary + #Mutta joka tapauksessa, pythonissa kannattaa käyttää dictionarya koska JSON:sta ei voi ottaa + #osia helposti + + #iltalehti = iltalehtiJSONOikea["rss"]["channel"]["item"] + + iltalehti = iltalehtiDICT["rss"]["channel"]["item"] + + for i in range(10): + print() + + + howManyToShow = 0 + + if number > len(iltalehti): + howManyToShow = len(iltalehti) + elif number <= len(iltalehti): + howManyToShow = number + + + for i in range(howManyToShow): + #print(iltalehti[i]["title"]) + + publishableArticle = textwrap.wrap(iltalehti[i]["description"], 80) + + for i in publishableArticle: + print(i) + print() + + return number if(countryString=="info"): + for i in range(10): + print() print() print("Hello! Welcome to my news-program!") print("This program uses 'newsapi.org' to get news from different sources") @@ -15,13 +62,36 @@ class NewsByCountry: print("To get news from a country, input country's short form, eg. 'us'") print("Country names must be written in lower-case") print() + print("To change the amount of news, input an integer, eg. '10'") + print() + print("If you wan't to leave the program, input 'exit'") + print() + print("In Finnish you can get news from Iltalehti with input 'iltalehti'") + print() print("All possible country inputs are: ") print("at, au, be, bg, br, ca, ch, cn, co, cu, cz, de, eg, fr, gb, gr, hk, hu, id, ie, il, in, it, jp, kr, lt, lv, ma, mx, my, ng, nl, no, nz, ph, pl, pt, ro, rs, ru, sa, se, sg, si, sk, th, tr, tw, ua, us, ve, za") print("Please note that news can can be in other languages than English!") print() + #Update this list when you can + print("You can find news in English from: au = Australia, ca = Canada, gb = Great Britain, us = USA") + print("And possibly from: hk=Hong Kong, ie = Ireland, in=India, jp=Japan, mx=Mexico, nz=New zealand, sg=singapore, za=south africa") + print() else: + if countryString.isnumeric(): + newNumber = int(countryString) + number = newNumber + for i in range(10): + print() + print("Number of news changed to " + str(number)) + print() + return number + + for i in range(10): + print() + print() - print("Top 5 news from '" + countryString + "':") + print("Top " + str(number) + " news from '" + countryString + "':") + url = "https://newsapi.org/v2/top-headlines?country=" + countryString + "&apiKey=9a5f1610264d4831b94ba00b1bdbd885" @@ -29,28 +99,65 @@ class NewsByCountry: someCountry = requests.get(url) content = json.loads(someCountry.content) - if(content["totalResults"]<5): + if(content["status"]=="ok"): + pass + + elif(content["status"]=="error"): print() - print("LESS THAN 5 RESULTS") - print("This many results: ") - print(content["totalResults"]) + print("Unknown error happened!") print() - print("This probably means that country's name is wrong or country not supported") + print("This is what we got from the server: ") + print(content) print() + number = -1 + return number + else: + if(content["code"]=="rateLimited"): + print() + print("Error!") + print("You have made too many requests") + print("Free accounts are limited to 50 requests in 12 hours") + print() + print("Here is the complete error message from server in JSON format: ") + print(content) + print() + number = -1 + return number - articles = content["articles"] + if(content["totalResults"]<1): + print() + print("ERROR: 0 RESULTS") + #print(str(content["totalResults"]) + " results") + #print(content["totalResults"]) + print() + print("This probably means that country's name is wrong or country is not supported") + print() + else: + + + articles = content["articles"] + results = len(articles) print() + printableNumber = 0 + + if(number>=len(articles)): + printableNumber = len(articles) + else: + printableNumber = number - for i in range(5): + + + for i in range(printableNumber): print(((articles[i])["source"])["name"] + ":") - if(articles[i]["description"]==NULL or articles[i]["description"]=="" or articles[i]["description"]==" "): + if(articles[i]["description"]==None or articles[i]["description"]=="" or articles[i]["description"]==" "): #Description is null, trying content: - if(articles[i]["content"]==NULL or articles[i]["content"]=="" or articles[i]["content"]==" "): - print("The content is also null, no can do") + if(articles[i]["content"]==None or articles[i]["content"]=="" or articles[i]["content"]==" "): + print("(This article has no description and no content!)") + print() else: article = articles[i]["content"] @@ -66,4 +173,9 @@ class NewsByCountry: for i in publishableArticle: print(i) - print() \ No newline at end of file + print() + if(results<number): + print("Found only " + str(results) + " results!") + print() + + return number \ No newline at end of file -- GitLab