Corona: better fix for site changes

This commit is contained in:
oddluck 2020-06-03 23:00:58 +00:00
parent 3c222a96f4
commit 87fdaca856

View File

@ -369,10 +369,7 @@ class Corona(callbacks.Plugin):
self.countries = requests.structures.CaseInsensitiveDict() self.countries = requests.structures.CaseInsensitiveDict()
self.states = requests.structures.CaseInsensitiveDict() self.states = requests.structures.CaseInsensitiveDict()
self.updated = None self.updated = None
self.headers = {}
self.top = {} self.top = {}
self.headers["countries"] = []
self.headers["states"] = []
self.top["countries"] = [] self.top["countries"] = []
self.top["states"] = [] self.top["states"] = []
@ -392,6 +389,9 @@ class Corona(callbacks.Plugin):
return rel_time return rel_time
def get_data(self): def get_data(self):
headers = {}
headers["countries"] = []
headers["states"] = []
OK = False OK = False
try: try:
r = requests.get("https://www.worldometers.info/coronavirus/", timeout=10) r = requests.get("https://www.worldometers.info/coronavirus/", timeout=10)
@ -411,105 +411,103 @@ class Corona(callbacks.Plugin):
if OK and not self.updated or OK and updated > self.updated: if OK and not self.updated or OK and updated > self.updated:
self.updated = updated self.updated = updated
table = soup.find("table", {"id": "main_table_countries_today"}) table = soup.find("table", {"id": "main_table_countries_today"})
self.headers["countries"] = [header.text for header in table.find_all("th")] headers["countries"] = [header.text for header in table.find_all("th")]
results = [ results = [
{ {
self.headers["countries"][i]: cell.text.strip() headers["countries"][i]: cell.text.strip()
for i, cell in enumerate(row.find_all("td")) for i, cell in enumerate(row.find_all("td"))
} }
for row in table.find_all("tr", {"style": ""}) for row in table.find_all("tr", {"style": ""})
] ]
results = sorted( results = sorted(
results, results,
key=lambda k_v: int( key=lambda k_v: int(re.sub("[^\d]", "", k_v["TotalCases"]))
re.sub("[^\d]", "", k_v[self.headers["countries"][2]]) if len(k_v) == len(headers["countries"])
)
if len(k_v) == len(self.headers["countries"])
else 0, else 0,
reverse=True, reverse=True,
) )
top = [] top = []
for item in results: for item in results:
if len(item) == len(self.headers["countries"]): if len(item) == len(headers["countries"]):
i = 0 i = 0
while i < len(self.headers["countries"]): while i < len(headers["countries"]):
if i < 8 and not item[self.headers["countries"][i]]: if i < 8 and not item[headers["countries"][i]]:
item[self.headers["countries"][i]] = "0" item[headers["countries"][i]] = "0"
elif not item[self.headers["countries"][i]]: elif not item[headers["countries"][i]]:
item[self.headers["countries"][i]] = "N/A" item[headers["countries"][i]] = "N/A"
if re.sub( if re.sub(
"[^\w. ]", "", item[self.headers["countries"][i]] "[^\w. ]", "", item[headers["countries"][i]]
).isdigit(): ).isdigit():
item[self.headers["countries"][i]] = int( item[headers["countries"][i]] = int(
re.sub("[^\d]", "", item[self.headers["countries"][i]]) re.sub("[^\d]", "", item[headers["countries"][i]])
) )
i += 1 i += 1
self.countries[item[self.headers["countries"][1]]] = item self.countries[item["Country,Other"]] = item
rank = results.index(item) - 1 rank = results.index(item) - 1
self.countries[item[self.headers["countries"][1]]]["rank"] = rank self.countries[item["Country,Other"]]["rank"] = rank
if rank > 0 and rank <= 10: if rank > 0 and rank <= 10:
top.append( top.append(
"#{0}: \x1F{1}\x1F (\x0307{2}\x03/\x0304{3}\x03)".format( "#{0}: \x1F{1}\x1F (\x0307{2}\x03/\x0304{3}\x03)".format(
rank, rank,
item[self.headers["countries"][1]], item["Country,Other"],
"{:,}".format(item[self.headers["countries"][2]]), "{:,}".format(item["TotalCases"]),
"{:,}".format(item[self.headers["countries"][4]]), "{:,}".format(item["TotalDeaths"]),
) )
) )
self.top["countries"] = top self.top["countries"] = top
for item in self.countries: for item in self.countries:
try: try:
self.countries[item]["ratio_new_cases"] = "{0:.1%}".format( self.countries[item]["ratio_new_cases"] = "{0:.1%}".format(
self.countries[item][self.headers["countries"][3]] self.countries[item]["NewCases"]
/ ( / (
self.countries[item][self.headers["countries"][2]] self.countries[item]["TotalCases"]
- self.countries[item][self.headers["countries"][3]] - self.countries[item]["NewCases"]
) )
) )
except: except:
self.countries[item]["ratio_new_cases"] = "0%" self.countries[item]["ratio_new_cases"] = "0%"
try: try:
self.countries[item]["ratio_new_dead"] = "{0:.1%}".format( self.countries[item]["ratio_new_dead"] = "{0:.1%}".format(
self.countries[item][self.headers["countries"][5]] self.countries[item]["NewDeaths"]
/ ( / (
self.countries[item][self.headers["countries"][4]] self.countries[item]["TotalDeaths"]
- self.countries[item][self.headers["countries"][5]] - self.countries[item]["NewDeaths"]
) )
) )
except: except:
self.countries[item]["ratio_new_dead"] = "0%" self.countries[item]["ratio_new_dead"] = "0%"
try: try:
self.countries[item]["ratio_dead"] = "{0:.1%}".format( self.countries[item]["ratio_dead"] = "{0:.1%}".format(
self.countries[item][self.headers["countries"][4]] self.countries[item]["TotalDeaths"]
/ self.countries[item][self.headers["countries"][2]] / self.countries[item]["TotalCases"]
) )
except: except:
self.countries[item]["ratio_dead"] = "N/A" self.countries[item]["ratio_dead"] = "N/A"
try: try:
self.countries[item]["ratio_recovered"] = "{0:.1%}".format( self.countries[item]["ratio_recovered"] = "{0:.1%}".format(
self.countries[item][self.headers["countries"][6]] self.countries[item]["TotalRecovered"]
/ self.countries[item][self.headers["countries"][2]] / self.countries[item]["TotalCases"]
) )
except: except:
self.countries[item]["ratio_recovered"] = "N/A" self.countries[item]["ratio_recovered"] = "N/A"
try: try:
self.countries[item]["mild"] = ( self.countries[item]["mild"] = (
self.countries[item][self.headers["countries"][7]] self.countries[item]["ActiveCases"]
- self.countries[item][self.headers["countries"][8]] - self.countries[item]["Serious,Critical"]
) )
except: except:
self.countries[item]["mild"] = "N/A" self.countries[item]["mild"] = "N/A"
try: try:
self.countries[item]["ratio_mild"] = "{0:.1%}".format( self.countries[item]["ratio_mild"] = "{0:.1%}".format(
self.countries[item]["mild"] self.countries[item]["mild"]
/ self.countries[item][self.headers["countries"][7]] / self.countries[item]["ActiveCases"]
) )
except: except:
self.countries[item]["ratio_mild"] = "N/A" self.countries[item]["ratio_mild"] = "N/A"
try: try:
self.countries[item]["ratio_serious"] = "{0:.1%}".format( self.countries[item]["ratio_serious"] = "{0:.1%}".format(
self.countries[item][self.headers["countries"][8]] self.countries[item]["Serious,Critical"]
/ self.countries[item][self.headers["countries"][7]] / self.countries[item]["ActiveCases"]
) )
except: except:
self.countries[item]["ratio_serious"] = "N/A" self.countries[item]["ratio_serious"] = "N/A"
@ -534,77 +532,74 @@ class Corona(callbacks.Plugin):
if OK: if OK:
soup = BeautifulSoup(r.content) soup = BeautifulSoup(r.content)
table = soup.find("table", {"id": "usa_table_countries_today"}) table = soup.find("table", {"id": "usa_table_countries_today"})
self.headers["states"] = [ headers["states"] = [header.text for header in table.find_all("th")]
header.text for header in table.find_all("th")
]
results = [ results = [
{ {
self.headers["states"][i]: cell.text.strip() headers["states"][i]: cell.text.strip()
for i, cell in enumerate(row.find_all("td")) for i, cell in enumerate(row.find_all("td"))
} }
for row in table.find_all("tr") for row in table.find_all("tr")
] ]
results = sorted( results = sorted(
results, results,
key=lambda k_v: int( key=lambda k_v: int(re.sub("[^\d]", "", k_v["TotalCases"]))
re.sub("[^\d]", "", k_v[self.headers["states"][1]]) if len(k_v) == len(headers["states"])
)
if len(k_v) == len(self.headers["states"])
else 0, else 0,
reverse=True, reverse=True,
) )
top = [] top = []
for item in results: for item in results:
if len(item) == len(self.headers["states"]): if len(item) == len(headers["states"]):
i = 0 i = 0
while i < len(self.headers["states"]): while i < len(headers["states"]):
if not item[self.headers["states"][i]]: if not item[headers["states"][i]]:
item[self.headers["states"][i]] = "0" item[headers["states"][i]] = "0"
if re.sub( if re.sub(
"[^\w. ]", "", item[self.headers["states"][i]] "[^\w. ]", "", item[headers["states"][i]]
).isdigit(): ).isdigit():
item[self.headers["states"][i]] = int( item[headers["states"][i]] = int(
re.sub("[^\d]", "", item[self.headers["states"][i]]) re.sub("[^\d]", "", item[headers["states"][i]])
) )
i += 1 i += 1
self.states[item[self.headers["states"][0]]] = item self.states[item["USAState"]] = item
rank = results.index(item) - 1 rank = results.index(item) - 1
self.states[item[self.headers["states"][0]]]["rank"] = rank self.states[item["USAState"]]["rank"] = rank
if rank > 0 and rank <= 10: if rank > 0 and rank <= 10:
top.append( top.append(
"#{0}: \x1F{1}\x1F (\x0307{2}\x03/\x0304{3}\x03)".format( "#{0}: \x1F{1}\x1F (\x0307{2}\x03/\x0304{3}\x03)"
.format(
rank, rank,
item[self.headers["states"][0]], item["USAState"],
"{:,}".format(item[self.headers["states"][1]]), "{:,}".format(item["TotalCases"]),
"{:,}".format(item[self.headers["states"][3]]), "{:,}".format(item["TotalDeaths"]),
) )
) )
self.top["states"] = top self.top["states"] = top
for item in self.states: for item in self.states:
try: try:
self.states[item]["ratio_new_cases"] = "{0:.1%}".format( self.states[item]["ratio_new_cases"] = "{0:.1%}".format(
self.states[item][self.headers["states"][2]] self.states[item]["NewCases"]
/ ( / (
self.states[item][self.headers["states"][1]] self.states[item]["TotalCases"]
- self.states[item][self.headers["states"][2]] - self.states[item]["NewCases"]
) )
) )
except: except:
self.states[item]["ratio_new_cases"] = "0%" self.states[item]["ratio_new_cases"] = "0%"
try: try:
self.states[item]["ratio_new_dead"] = "{0:.1%}".format( self.states[item]["ratio_new_dead"] = "{0:.1%}".format(
self.states[item][self.headers["states"][4]] self.states[item]["NewDeaths"]
/ ( / (
self.states[item][self.headers["states"][3]] self.states[item]["TotalDeaths"]
- self.states[item][self.headers["states"][4]] - self.states[item]["NewDeaths"]
) )
) )
except: except:
self.states[item]["ratio_new_dead"] = "0%" self.states[item]["ratio_new_dead"] = "0%"
try: try:
self.states[item]["ratio_dead"] = "{0:.1%}".format( self.states[item]["ratio_dead"] = "{0:.1%}".format(
self.states[item][self.headers["states"][3]] self.states[item]["TotalDeaths"]
/ self.states[item][self.headers["states"][1]] / self.states[item]["TotalCases"]
) )
except: except:
self.states[item]["ratio_dead"] = "N/A" self.states[item]["ratio_dead"] = "N/A"
@ -670,24 +665,24 @@ class Corona(callbacks.Plugin):
"(\x0310{12}\x03 Mild) (\x0313{13}\x03 Serious) (\x0310{14}\x03/" "(\x0310{12}\x03 Mild) (\x0313{13}\x03 Serious) (\x0310{14}\x03/"
"\x0313{15}\x03) | Cases/1M: \x0307{16}\x03 | Deaths/1M: \x0304{17}" "\x0313{15}\x03) | Cases/1M: \x0307{16}\x03 | Deaths/1M: \x0304{17}"
"\x03 | Updated: {18}".format( "\x03 | Updated: {18}".format(
self.countries[search][self.headers["countries"][1]], self.countries[search]["Country,Other"],
self.countries[search]["rank"], self.countries[search]["rank"],
self.countries[search][self.headers["countries"][2]], self.countries[search]["TotalCases"],
self.countries[search][self.headers["countries"][3]], self.countries[search]["NewCases"],
self.countries[search]["ratio_new_cases"], self.countries[search]["ratio_new_cases"],
self.countries[search][self.headers["countries"][4]], self.countries[search]["TotalDeaths"],
self.countries[search]["ratio_dead"], self.countries[search]["ratio_dead"],
self.countries[search][self.headers["countries"][5]], self.countries[search]["NewDeaths"],
self.countries[search]["ratio_new_dead"], self.countries[search]["ratio_new_dead"],
self.countries[search][self.headers["countries"][6]], self.countries[search]["TotalRecovered"],
self.countries[search]["ratio_recovered"], self.countries[search]["ratio_recovered"],
self.countries[search][self.headers["countries"][7]], self.countries[search]["ActiveCases"],
self.countries[search]["mild"], self.countries[search]["mild"],
self.countries[search][self.headers["countries"][8]], self.countries[search]["Serious,Critical"],
self.countries[search]["ratio_mild"], self.countries[search]["ratio_mild"],
self.countries[search]["ratio_serious"], self.countries[search]["ratio_serious"],
self.countries[search][self.headers["countries"][9]], self.countries[search]["Tot\xa0Cases/1M pop"],
self.countries[search][self.headers["countries"][10]], self.countries[search]["Deaths/1M pop"],
self.time_created(self.updated), self.time_created(self.updated),
) )
) )
@ -699,18 +694,18 @@ class Corona(callbacks.Plugin):
"(\x0304{6}\x03) (\x0304+{7}\x03) (\x0304+{8}\x03) | Active: " "(\x0304{6}\x03) (\x0304+{7}\x03) (\x0304+{8}\x03) | Active: "
"\x0307{9}\x03 | Cases/1M: \x0307{10}\x03 | Deaths/1M: " "\x0307{9}\x03 | Cases/1M: \x0307{10}\x03 | Deaths/1M: "
"\x0304{11}\x03 | Updated: {12}".format( "\x0304{11}\x03 | Updated: {12}".format(
self.states[search][self.headers["states"][0]], self.states[search]["USAState"],
self.states[search]["rank"], self.states[search]["rank"],
self.states[search][self.headers["states"][1]], self.states[search]["TotalCases"],
self.states[search][self.headers["states"][2]], self.states[search]["NewCases"],
self.states[search]["ratio_new_cases"], self.states[search]["ratio_new_cases"],
self.states[search][self.headers["states"][3]], self.states[search]["TotalDeaths"],
self.states[search]["ratio_dead"], self.states[search]["ratio_dead"],
self.states[search][self.headers["states"][4]], self.states[search]["NewDeaths"],
self.states[search]["ratio_new_dead"], self.states[search]["ratio_new_dead"],
self.states[search][self.headers["states"][5]], self.states[search]["ActiveCases"],
self.states[search][self.headers["states"][6]], self.states[search]["Tot\xa0Cases/1M pop"],
self.states[search][self.headers["states"][7]], self.states[search]["Deaths/1M pop"],
self.time_created(self.updated), self.time_created(self.updated),
) )
) )
@ -725,40 +720,22 @@ class Corona(callbacks.Plugin):
"Cases/1M: \x0307{15}\x03 | Deaths/1M: \x0304{16}\x03 | " "Cases/1M: \x0307{15}\x03 | Deaths/1M: \x0304{16}\x03 | "
"Updated: {17}".format( "Updated: {17}".format(
"Global", "Global",
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["TotalCases"],
self.headers["countries"][2] self.countries[list(self.countries)[0]]["NewCases"],
],
self.countries[list(self.countries)[0]][
self.headers["countries"][3]
],
self.countries[list(self.countries)[0]]["ratio_new_cases"], self.countries[list(self.countries)[0]]["ratio_new_cases"],
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["TotalDeaths"],
self.headers["countries"][4]
],
self.countries[list(self.countries)[0]]["ratio_dead"], self.countries[list(self.countries)[0]]["ratio_dead"],
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["NewDeaths"],
self.headers["countries"][5]
],
self.countries[list(self.countries)[0]]["ratio_new_dead"], self.countries[list(self.countries)[0]]["ratio_new_dead"],
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["TotalRecovered"],
self.headers["countries"][6]
],
self.countries[list(self.countries)[0]]["ratio_recovered"], self.countries[list(self.countries)[0]]["ratio_recovered"],
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["ActiveCases"],
self.headers["countries"][7]
],
self.countries[list(self.countries)[0]]["mild"], self.countries[list(self.countries)[0]]["mild"],
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["Serious,Critical"],
self.headers["countries"][8]
],
self.countries[list(self.countries)[0]]["ratio_mild"], self.countries[list(self.countries)[0]]["ratio_mild"],
self.countries[list(self.countries)[0]]["ratio_serious"], self.countries[list(self.countries)[0]]["ratio_serious"],
self.countries[list(self.countries)[0]][ self.countries[list(self.countries)[0]]["Tot\xa0Cases/1M pop"],
self.headers["countries"][9] self.countries[list(self.countries)[0]]["Deaths/1M pop"],
],
self.countries[list(self.countries)[0]][
self.headers["countries"][10]
],
self.time_created(self.updated), self.time_created(self.updated),
) )
) )