Arvutiteaduse instituut
  1. Kursused
  2. 2022/23 kevad
  3. Programmeerimise alused (MTAT.03.236)
EN
Logi sisse

Programmeerimise alused 2022/23 kevad

  • Pealeht
  • 1. Sissejuhatus
  • 2. Tingimuslause
  • 3. Tsükkel
  • 4. Järjend
  • 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

failVeebis = urlopen("http://kodu.ut.ee/~heidi77/programmeerimine/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/~heidi77/programmeerimine/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.

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="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(" &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.

Ü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 >
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused