Ahoj, potřeboval bych poradit jakožto naprostý zoufalý začátečník.
Máme k zápočtu udělat jednoduchý program v Pythonu, který načte odněkud externí data a nějak s nimi pracuje v GUI. Vymyslel jsem, že udělám aplikaci, kde si z rozbalovacího menu vyberu krajské město vypíšou se mi k němu data o počasí ze serveru in-pocasi.cz.
Data ze stránky získám pomocí <code>BeautifulSoup</code>. Načtu je v cyklu do pole typu 'list' a v dalším cyklu je vypíšu. Když udělám pole jednorozměrné, všechno funguje, až na to, že když na stránce některý údaj chybí, tak nezískám prázdnou hodnotu, ale hodnota mi úplně chybí, což mi rozhodí přiřazení dat.
Zkusil jsem tedy kontrolovat, zda jsou data dostupná, a výsledky ukládat do dvourozměrného pole, abych věděl, co za hodnoty v poli mám. Ale když to udělám, přestane mi fungovat načítání textového obsahu z html pomocí <code>.text</code>. Trávím nad tím celý večer a netuším, jak na to...
Pokud byste mi poradili, jak to opravit případně napsat úplně jinak, byl bych rád. V následujícím kódu neřeším GUI, takže případný výběr města se udělá překomentováním url
from bs4 import BeautifulSoup
import requests
# získám html
url = 'https://www.in-pocasi.cz/aktualni-pocasi/olomouc/'
#url = 'https://www.in-pocasi.cz/aktualni-pocasi/brno_k/'
url_get = requests.get(url)
soup = BeautifulSoup(url_get.content, 'lxml')
#seznam údajů, které chci ze stránky vycucnout do 'mytds'
seznam = ["Čas měření", "Teplota", "Vítr", "Vlhkost", "Tlak", "Srážky dnes", "Změna teploty (30 min)", "Teplota před 24 hodinami", "Rosný bod"]
mytds = [] #typ list
# funkční verze, ale problematicky (funguje jen tehdy, když stránka obsahuje všechna data,
# například olomouc. Ale pokud se url přehodí na brno_k, chybí tam údaje a problém je na světě,
# protože se nenalezené záznamy vynechají a všechno se rozjede)
# načtení jednorozměrného seznamu
'''
for i in range(9):
data = soup.find_all("td", {"data-title": seznam[i]})
mytds.extend(data)
# vypsání seznamu
for i in range(len(mytds)):
txt = seznam[i]+": "+mytds[i].text
print(txt)
'''
# nefunkční verze, která by měla ukládat jen ta data, která jsou dostupná
for i in range(9):
data = soup.find_all("td", {"data-title": seznam[i]})
# tady ke každému 'řádku' v mytds ukládám 2 údaje: index seznamu + hodnotu, abych
# při vypisování mohl údaje správně spárovat. A do mytds ukládám jen 'řádky', jejichž
# hodnoty se ze stránky načetly. Ale netuším, jak zkonstruovat ten .extend (nebo .append),
# aby mi fungovalo následující mytds[i][1].text
if data:
mytds.extend([[i, data]])
for i in range(len(mytds)):
txt=seznam[i]+": "+mytds[i][1].text
print(txt)