Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 7. nädala sisukord | järgmine > |
7.1 Lugemine veebist
Juba mitu nädalat tagasi tutvusime võimalusega oma arvutis olevast failist andmeid kätte saada. Võimalik on aga, et huvitav info on hoopis veebis. 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 http://kodu.ut.ee/~marinai/eprogalused/mesipuu.txt, siis saame selle kätte järgmise programmiga.
from urllib.request import urlopen failVeebis = urlopen("http://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. Vahel on aga vaja ridasid eraldi käsitleda ja siis on abiks funktsioon splitlines, mis sõne reavahetuse kohtadelt järjendisse "lõhub".
from urllib.request import urlopen failVeebis = urlopen("http://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 (ridadeKaupa[4]
) on siis tavamõistes 5. rida, sest loendamine algab nullist. Kuna tegemist on sõnega, siis saame selle üksiku sümboli ka indeksi abil kätte. Näiteks real indeksiga 4 saab sümboli indeksiga 7 ridadeKaupa[4][7]
. Proovige, mis sümbol sellel kohal on. Vastust küsitakse 7. nädala testis.
Eelmises näites oli veebis ilma vorminduseta tekstifail. Suur osa veebis olevatest failidest on keerulisema struktuuriga. Sageli sellisega, kus lehekülje lähtekood on tavalisele vaatajale arusaamatu ja alles nt veebilehitseja kuvab nii, et oleks arusaadav.
Näiteks Tartu Ülikooli arvutiteaduse instituudi veebileht algab nii.
<!DOCTYPE html> <html lang="et" dir="ltr" prefix="content: http://purl.org/rss/1.0/modules/content/ dc: http://purl.org/dc/terms/ foaf: http://xmlns.com/foaf/0.1/ og: http://ogp.me/ns# rdfs: http://www.w3.org/2000/01/rdf-schema# schema: http://schema.org/ sioc: http://rdfs.org/sioc/ns# sioct: http://rdfs.org/sioc/types# skos: http://www.w3.org/2004/02/skos/core# xsd: http://www.w3.org/2001/XMLSchema# "> <head> <meta charset="utf-8" />
Esimese reaga saame teada, et tegemist on HTML-keele tekstiga !DOCTYPE html
. HTML (HyperText Markup Language) on veebilehtede, mis ongi oma olemuselt hüpertekstid, puhul väga levinud. (Vt ka https://et.wikipedia.org/wiki/HTML .) Teisel real näidatakse, et keel on eesti keel lang="et"
ja tekst on vasakult paremale (dir="ltr"
Left-to-right). Edasi on veel näha, et teksti kodeering on UTF-8. HTML-keeles on olulisel kohal märgendid, mida pannakse < > vahele ja mille abil oskab veebilehitseja teksti sobivalt kuvada. Märgendikeeli on peale HTML teisi ka. Sageli on nende akronüümide lõpus ML, aga mitte alati. Näiteks on märgendikeel ka LaTeX.
Järgmine programm loeb meie instituudi veebilehelt 453 esimest märki. Nimelt saab funktsioonile read()
ka argumendi ette anda. Kui argumenti pole, siis loetakse terve fail.
from urllib.request import urlopen failVeebis = urlopen("http://www.cs.ut.ee") baidid = failVeebis.read(453) # 453 esimest tekst = baidid.decode() # baitidest saab sõne print(tekst) failVeebis.close()
Kui lehekülg on teatud struktuuriga, siis saab kirjutada programmi, mis otsib sealt huvipakkuvaid andmeid. Nt järgmine programm loeb aadressilt http://meteo.physic.ut.ee/ ühe valitud kuupäeva andmed ja leiab sealt selle päeva keskmise temperatuuri.
from urllib.request import urlopen import ssl #on vajalik saidi sertifikaadi tõttu import certifi #on vajalik saidi sertifikaadi tõttu #valitud kuupäev päev = 24 kuu = 10 aasta = 2023 #paneme lingi kokku, teine arugment on vajalik selle saidi sertifikaadi tõttu vastus = urlopen("https://meteo.physic.ut.ee/et/showperiod.php?type=setday&year="+str(aasta)+"&month="+str(kuu)+"&day="+str(päev), context=ssl.create_default_context(cafile=certifi.where())) #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))
Uurige erinevate päevade keskmisi temperatuure. Nt kui palju erineb 2013. aasta jõulupäeva keskmine 2014. aasta jaanipäeva keskmisest.
Ülesanne
Pythoni programmi saab panna veebilehitsejat avama.
from webbrowser import * open("www.cs.ut.ee")
Samuti saab programselt avada selle lehekülje, mis näitab, mis on õigekeelsussõnastikus kirjas sõna "programmeerimine" kohta.
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)
< eelmine | 7. nädala sisukord | järgmine > |