У меня проблема в том, что я не могу найти данные из таблицы html на метке tkinter - PullRequest
0 голосов
/ 03 августа 2020
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
import bs4
from tkinter import *

def statno():
    covidTk = Tk()
    covidTk.title('Data statistics of COVID-19')
    
    lb1 = Label(covidTk,text='Country: ')
    lb1.grid(row=1,column=0,padx=10,pady=10)

    lb2 = Label(covidTk,text=entcon.get())
    lb2.grid(row=1,column=1,padx=10,pady=10)

    res = requests.get("https://www.worldometers.info/coronavirus/#countries")

    soup = BeautifulSoup(res.text, "html.parser")

    table = soup.find("table", {"id":"main_table_countries_today"})
    columns = [i.get_text(strip=True) for i in table.find("thead").find_all("th")]

    rows = []

    for row in table.find("tbody").find_all("tr"):
        rows.append([i.get_text(strip=True) for i in row.find_all("td")])


    df = pd.DataFrame(rows, columns=columns)

    lb3 = Label(covidTk,text='Number of cases: ')
    lb3.grid(row=2,column=0,padx=10,pady=10)

    case_value = int(df.loc[lb2.cget('text')]['Total Cases'])
    lb4 = Label(covidTk,text=case_value)
    lb4.grid(row=2,column=1,padx=10,pady=10)
    
    

win = Tk()
win.title('COVID-19 tracker')

web = requests.get('https://www.worldometers.info/coronavirus')
objSoup = bs4.BeautifulSoup(web.text,'lxml')

lbtitle = Label(win,text='Covid-19 Statistics')
lbtitle.grid(row=0,columnspan=2)

lbcon = Label(win,text='Country: ')
lbcon.grid(row=1,column=0,padx=10,pady=20)

conname = StringVar()
entcon = Entry(win,textvariable=conname)
entcon.grid(row=1,column=1,padx=10,pady=20)

btncheck = Button(win,text='Check data',command=statno)
btncheck.grid(row=2,column=1,padx=10,pady=10)

lbcase = Label(win,text='Coronavirus Cases: ')
lbcase.grid(row=3,column=0)

total = objSoup.find_all('div',{'class':'maincounter-number'})
total_cases = total[0]
lbdat1 = Label(win,text=total_cases.text)
lbdat1.grid(row=3,column=1)

lbdeaths = Label(win,text='Deaths: ')
lbdeaths.grid(row=4,column=0)

total_deaths = total[1]
lbdat2 = Label(win,text=total_deaths.text)
lbdat2.grid(row=4,column=1)

lbcase = Label(win,text='Recovered: ')
lbcase.grid(row=5,column=0)

total_recover = total[2]
lbdat3 = Label(win,text=total_recover.text)
lbdat3.grid(row=5,column=1)




    During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "E:\Python\Python Projects Fun\covid_gui.py", line 36, in statno
    case_value = int(df.loc[lb2.cget('text')]['Total Cases'])
  File "C:\Python38\lib\site-packages\pandas\core\indexing.py", line 1768, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "C:\Python38\lib\site-packages\pandas\core\indexing.py", line 1965, in _getitem_axis
    return self._get_label(key, axis=axis)
  File "C:\Python38\lib\site-packages\pandas\core\indexing.py", line 625, in _get_label
    return self.obj._xs(label, axis=axis)
  File "C:\Python38\lib\site-packages\pandas\core\generic.py", line 3537, in xs
    loc = self.index.get_loc(key)
  File "C:\Python38\lib\site-packages\pandas\core\indexes\range.py", line 353, in get_loc
    return super().get_loc(key, method=method, tolerance=tolerance)
  File "C:\Python38\lib\site-packages\pandas\core\indexes\base.py", line 2648, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas\_libs\index.pyx", line 111, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\index.pyx", line 135, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\index_class_helper.pxi", line 109, in pandas._libs.index.Int64Engine._check_type
KeyError: 'Brazil'

Извините, у меня проблема, когда я использую int(df.loc[lb2.cget('text')]['Total Cases']), отображается указанная выше ошибка. Могу я спросить, что мне следует изменить, если я хочу найти данные, соответствующие стране, в той же строке, что и метка tkinter? Я тщательно просмотрел книги, но все еще не смог найти возможное решение для устранения указанной выше ошибки. Так кто-нибудь может научить меня, как с этим бороться? Я не знаю, почему ошибка ключа, потому что я проверил и орфографию нет. Эту проблему я уже исправил, просмотрев документацию и узнав больше о методах. В следующий раз, если я столкнусь с той же проблемой, я смогу сделать это сам и подумать больше, чем я думаю, что смогу справиться с ней сам. Прежде чем задавать новые вопросы, я сначала проведу дополнительные исследования и буду спрашивать только при необходимости.

1 Ответ

2 голосов
/ 03 августа 2020

Некоторые проблемы.

В ваших столбцах или строках нет названия страны. Кроме того, имя столбца неверно. Чтобы получить указанные c строки, вы можете использовать case_value = df.loc[df["Country,Other"] == lb2.cget('text')]['TotalCases'].values[0], чтобы получить значение напрямую. И, в конце концов, вы не использовали mainloop. Нет необходимости преобразовывать его в целое число, вы можете использовать Label(covidTk, text=case_value) напрямую.

Теперь он отлично работает .

введите описание изображения здесь

...