Institute of Computer Science
  1. Courses
  2. 2024/25 spring
  3. Introduction to Programming (MTAT.03.236)
ET
Log in

Introduction to Programming 2024/25 spring

  • Pealeht
  • 1. Sissejuhatus
  • 2. Tingimuslause
  • 3. Tsükkel
  • 4. Järjend ja for-tsükkel
  • 5. Funktsioon
  • 6. Andmevahetus. Lihtne kasutajaliides
  • Loengud
  • Moodle
  • Lahendus
  • Thonny paigaldamine
  • Thonny logide esitamine
  • Silumine
  • Kiireksamist
  • Viited
< eelmine6. nädala sisukordjärgmine >

6.1 Lugemine veebist

VEEBIS ON FAIL

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/~heidi77/programmeerimine/mesipuu.txt, siis saame selle kätte järgmise programmiga.

from urllib.request import urlopen

fail_veebis = urlopen("http://kodu.ut.ee/~heidi77/programmeerimine/mesipuu.txt")
baidid = fail_veebis.read() # kogu fail baitidena
tekst = baidid.decode() # baitidest saab sõne
fail_veebis.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

fail_veebis = urlopen("http://kodu.ut.ee/~heidi77/programmeerimine/mesipuu.txt")
baidid = fail_veebis.read()
tekst = baidid.decode() # baitidest saab sõne
ridade_kaupa = tekst.splitlines() # sõne jaotatakse reavahetuse kohtadelt
fail_veebis.close()
print(ridade_kaupa[4]) # rida indeksiga 4

Rida indeksiga 4 (ridade_kaupa[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 ridade_kaupa[4][7]. Proovige, mis sümbol sellel kohal on.

KINDEL STRUKTUUR. HTML

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="og: https://ogp.me/ns#">
  <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 448 esimest märki. Nimelt saab funktsioonile read() ka argumendi ette anda. Kui argumenti pole, siis loetakse terve fail.

from urllib.request import urlopen
fail_veebis = urlopen("http://www.cs.ut.ee")
baidid = fail_veebis.read(448) # 448 esimest
tekst = baidid.decode() # baitidest saab sõne
print(tekst)
fail_veebis.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 = 5
kuu = 3
aasta = 2025

#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(" &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))

Uurige erinevate päevade keskmisi temperatuure. Nt kui palju erineb 2013. aasta jõulupäeva keskmine 2014. aasta jaanipäeva keskmisest.

Automaatkontrolliga enesekontrolliülesanne

Valikvastustega enesekontrolliülesanne

PÄRINGU TULEMUSENA. JSON

See osa on natuke tehnilisem ja ülesannete ning testi lahendamiseks kohustuslik pole.

Infot ei pruugi saada ainult olemasolevatest failidest, vaid ka päringu tulemusena. Sellisel juhul moodustub info just antud hetkel vastavalt konkreetsele päringule. Selleks, et erinevad programmid, mis võivad olla kirjutatud erinevates programmeerimiskeeltes, saaksid andmeid omavahel vahetada, on kasutusel standardid. Üks nendest on JSON (vt https://et.wikipedia.org/wiki/JSON). Selle standardi jaoks on olemas moodul ka Pythonis (vt https://docs.python.org/3/library/json.html#module-json). Järgmises programmis ongi sellega tegemist, kuna Google'i otsingu tulemused saame vajadusel JSON vormingus. Otsingu jaoks aga tuleb kokku panna veebiaadress, mis koosneb kahest osast: http://ajax.googleapis.com/ajax/services/search/web?v=1.0 ja päring, mis võib olla lihtsalt q=Tartu. Neid ühendab &. (http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Tartu)

Programselt saame tükid üheks aadressiks kokku panna nii.

päring = "q=Tartu"
url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" + päring
https://developers.google.com/web-search/docs/reference

Järgmine programm aga küsib otsingusõna kasutajalt.

import json, urllib.request, urllib.parse

def google(otsingusõna):

    päring = "q=" + otsingusõna 
    ## paneme lingi kokku
    url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" + päring
    otsing = urllib.request.urlopen(url)
    ## kogu info baitidena ja baitidest saab sõne
    otsinguTulemused = otsing.read().decode("utf8")
    ## teisendame JSON sõne Pythoni objektiks
    tulemused = json.loads(otsinguTulemused)
    ## võtame ainult huvipakkuvad andmed
    andmed = tulemused["responseData"]

    ## üldised andmed
    print("Kokku tulemusi: " + andmed["cursor"]["resultCount"])
    print("Aega kulus: " + andmed["cursor"]["searchResultTime"])
    print("")

    ## leitud vasted
    print("Tulemused: ")
    leiud = andmed["results"]
    for leid in leiud:
        print(leid["url"])

    ## Otsing
otsingusõna = input("Sisesta otsingusõna: ")
google(otsingusõna)

Hetkel anti neli vastet, kui tahame näiteks kaheksat, siis asendame vastava rea programmis.

#päring = urllib.parse.urlencode({'q':otsingusõna, 'rsz': 8, 'start': 0}) 

AVAME VEEBILEHITSEJA

Pythoni programmi saab panna veebilehitsejat avama.

from webbrowser import *
open("http://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)

Google'i otsingu programmi saame ka nii muuta, et vastavad lehed veebilehitsejas kohe avataks. (Vastav import tuleb ka korraldada.)

for leid in leiud:
    webbrowser.open(leid["url"])

< eelmine6. nädala sisukordjärgmine >
  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment