34 Lugemine veebist
Veebis on fail
Mitu peatükki tagasi tutvusime võimalusega oma arvutis olevast failist andmeid lugeda. Tänapäeval tuleb tihti ka ette, et soovitud fail paikneb kusagil internetis. Pythoniga ei ole veebist lugemine eriti raske. Kasutada saab käsku urlopen
, mis on vaja eelnevalt importida moodulist urllib.request.
Kui meid huvitav info (antud juhul Juhan Liivi luuletuse “Ta lendab mesipuu poole” 1. salm) on aadressil https://kodu.ut.ee/~marinai/eprogalused/mesipuu.txt, siis saame selle kätte järgmise programmiga:
Näiteprogramm. Faili lugemine veebist
from urllib.request import urlopen failVeebis = urlopen("https://kodu.ut.ee/~marinai/eprogalused/mesipuu.txt") baidid = failVeebis.read() # kogu fail baitidena tekst = baidid.decode() # baitidest saab sõne failVeebis.close() print(tekst)
Hetkel käsitlesime kogu teksti tervikuna: algul baitidena, hiljem ühe sõnena. Kuna selles sõnes on ka reavahetused, siis kuvati sõne mitme reana. Kui ridasid on tarvis käsitleda eraldi sõnedena, siis on abiks funktsioon splitlines
, mis jagab ühe sõne reavahetuse kohtade järgi sõnede järjendiks:
Näiteprogramm. Faili lugemine veebist koos ridade eraldamisega
from urllib.request import urlopen failVeebis = urlopen("https://kodu.ut.ee/~marinai/eprogalused/mesipuu.txt") baidid = failVeebis.read() tekst = baidid.decode() # baitidest saab sõne ridadeKaupa = tekst.splitlines() # sõne jaotatakse reavahetuse kohtadelt failVeebis.close() print(ridadeKaupa[4]) # rida indeksiga 4
Rida indeksiga 4 (
) on tavamõistes 5. rida, sest loendamine algab nullist. Kuna tegemist on sõnega, siis saame indeksi abil kätte selle üksikuid sümboleid. Näiteks real indeksiga 4 saab sümboli indeksiga 7 kätte käsuga ridadeKaupa[4]
ridadeKaupa[4][7]
. Proovi, mis sümbol sellel kohal on.
Kindel struktuur. HTML
Eelmises näites lugesime veebist ilma vorminduseta tekstifaili. Suur osa veebis olevatest failidest on keerulisema struktuuriga, sageli sellisega, kus lehekülje lähtekood on tavalisele vaatajale arusaamatu. Enamjaolt on lähtekoodis arvestatud sellega, et veebilehitseja muudaks selle inimesele mõistetavaks väljundiks. Näiteks Tartu Ülikooli arvutiteaduse instituudi veebileht algab nii:
<!DOCTYPE html> <html lang="et" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Esimese rida
tähistab, et tegemist on HTML-keelse tekstiga. HTML (HyperText Markup Language) on ilmselt levinuim veebilehtede loomisel kasutatav keel. (Loe lisaks https://et.wikipedia.org/wiki/HTML). Teisel real näidatakse, et keel on eesti keel !DOCTYPE html
ja tekst on vasakult paremale (lang="et"
Left-to-right). Neljandal real on näiteks näha, et teksti kodeering on UTF-8 (dir="ltr",
charset=utf-8
).
HTML-keeles on olulisel kohal märgendamine (markup). Märgendi algust ja lõppu tähistavad sümbolid < ja > ning märgendi sisu järgi oskab veebilehitseja teksti sobivalt kuvada. Leidub teisigi märgendikeeli, kus märgendid on erinevalt esitatud (nt dokumentide kirjutamiseks kasutatav LaTeX).
Enesekontroll (1 ülesanne)
Loetavate sümbolite piiramine
Funktsioonile read
saab anda ka argumendi, mis piirab loetavate märkide arvu. Kui argumenti pole, siis loetakse terve fail.
Järgmine programm loeb instituudi veebilehelt 121 esimest märki:
Näiteprogramm. Esimeste sümbolite lugemine
from urllib.request import urlopen failVeebis = urlopen("http://www.cs.ut.ee") baidid = failVeebis.read(121) # 121 esimest tekst = baidid.decode() # baitidest saab sõne print(tekst) failVeebis.close()
Struktuuri töötlemine
Kui lehekülg on teatud struktuuriga (nt HTML-keeles, millega tutvusime eespool), siis saab kirjutada programmi, mis otsib sealt huvipakkuvaid andmeid. Ka võib lehekülje aadressis olla aasta, kuu ja kuupäev (näiteks
http://meteo.physic.ut.ee/et/showperiod.php?type=setmonth&year=2018&month=10&m=24). Järgmine programm loeb aadressilt http://meteo.physic.ut.ee/ ühe valitud kuupäeva andmed ja leiab sealt selle päeva keskmise temperatuuri:
Näiteprogamm. Keskmise õhutemperatuuri lugemine
from urllib.request import urlopen #valitud kuupäev päev = 24 kuu = 10 aasta = 2018 #paneme lingi kokku vastus = urlopen("http://meteo.physic.ut.ee/et/showperiod.php?type=setday&year="+str(aasta)+"&month="+str(kuu)+"&day="+str(päev)) #loeme terve faili baidid = vastus.read() tekst = baidid.decode() #otsime failis sõna 'keskmine', mis on ümbritsetud HTML-märgenditega otsitav = "<SMALL>keskmine</SMALL><BR><B>" algus = tekst.index(otsitav) #meetod index tagastab otsitava sõna positsiooni alguse temp_algus = algus + len(otsitav) #indeks, kust tekstis võib leida temperatuuri deg = tekst.index(" °") #peale temperatuuri on tühik ja sümbol temp = tekst[temp_algus:deg] #lõikame temperatuuri välja #väljastame kuupäeva ja keskmise temperatuuri print(str(päev)+"."+str(kuu)+"."+str(aasta)+": "+str(temp))
Uuri erinevate päevade keskmisi temperatuure. Kui palju erineb 2013. aasta jõulupäeva keskmine 2014. aasta jaanipäeva keskmisest?
Veebilehitseja avamine
Pythoni programmi saab panna veebilehitsejat avama:
from webbrowser import * open("www.cs.ut.ee")
Avame programselt lehekülje, mis näitab, mis on õigekeelsussõnastikus kirjas sõna “programmeerimine” kohta (kui kasutame sõnastikus otsingut, ilmub aadressireale täpne aadress, mida programmis kasutada):
from webbrowser import * aadress = "http://www.eki.ee/dict/qs/index.cgi?Q=programmeerimine" open (aadress)
Võime ka otsisõna programmi kasutajalt küsida:
from webbrowser import * sona = input("Sisestage sõna: ") aadress = "http://www.eki.ee/dict/qs/index.cgi?Q=" + sona open(aadress)