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 (ridadeKaupa[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][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 !DOCTYPE html 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 lang="et" ja tekst on vasakult paremale (dir="ltr", Left-to-right). Neljandal real on näiteks näha, et teksti kodeering on UTF-8 (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(" &deg;")        #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)

 

 

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Programmeerimine on loodud Eno Tõnisson, Tauno Palts, Merilin Säde, Kaarel Tõnisson jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut