Avoin data - Pääteohjaus 7
Avoin data
Käytetään muiden tekemiä XML-dokumentteja ja WWW-sivuja tiedonlähteenä.
DOM-rajapinta on tuttu jo TIEA2120 WEb-käyttöliittymien ohjelmointi -kurssilta. Jos olet unohtanut niin kertaa Document Object Model (DOM) ja Javascript ja DOM. Tässä pääteohjauksessa opetellaan DOM-rajapinnan käyttäminen Python-ohjelmointikielellä.
Ulkoisen XML-datan sisällyttäminen omalle sivulle
- Aloita uusi python-ohjelma. Pyritään hakemaan ja parsimaan http://appro.mit.jyu.fi/tiea2080/ohjaus/ohjaus7/data.xml- tiedosto ja sisällyttämään siitä tärkeimmät osat omalle sivulle. Käsiteltävän tiedoston rakenne on sama kuin aiemmin käytetyissä json-versioissa. Katso malliohjelman tuloste (Mallin lähdekoodi).
- Haetaan XML-dokumentti käyttäen Pythonin xml.dom.minidom ja urllib-kirjastoja.
- Tee ensin pelkästään komentoriviltä toimiva versio.
from xml.dom.minidom import parse import urllib doc = parse( urllib.urlopen("tähän sivun osoite")) print doc.toxml('UTF-8')
Kokeile tulostuuko komentoriviltä ajettaessa sivun sisältö - Kaivellaan dokumentista yksittäisiä osia. Haetaan ensimmäiseksi yleistietoja:
# Haetaan kilpailun tiedot eli ensimmäiset esiintymät nimi, kesto, alkuaika ja loppuaika elementeistä nimi = doc.getElementsByTagName("nimi")[0] kesto = doc.getElementsByTagName("kesto")[0] alkuaika = doc.getElementsByTagName("alkuaika")[0] loppuaika = doc.getElementsByTagName("loppuaika")[0]
- Tulosta kaikkien hakemiesi elementtien tekstisisältö. Muista kokeilla komentorivillä, että ohjelma toimii.
textContent-ominaisuus ei toimi minidomissa joten joudut käyttämään:
nimi.firstChild.nodeValue
- Tee samaan tapaan listaus joukkueiden nimistä. Hae kaikki joukkueet-elementit, käy ne silmukassa läpi, hae jokaisen joukkueet-elementin alta ensimmäinen nimi-elementti ja tulosta sen sisältö.
- Mitäs jos haluat tulostaa joukkueiden nimet sarjoittain? Kokeile tehdä tämä ja tulosta aina ensin sarjan nimi ja sen alle sisennettynä kaikkien sarjaan kuuluvien joukkueiden nimet
- Tee nyt sovelluksestasi web-sovellus (CGI-ohjelma, Flask-sovellus tai appengine-sovellus) ja luo XML-tiedoston sisällöstä järkevä html-dokumentti. Vrt. mallisovellus ((Mallin lähdekoodi)).
XML ja nimiavaruudet
XML-dokumenttiin voi olla sisällytetty elementtejä useasta eri nimiavaruudesta (namespace). Tämä täytyy osata huomioida dokumentin sisältöä käsiteltäessä. Käytetystä kirjastosta riippuen voi joutua käyttämään getElementsByTagNameNS-funktiota tavallisen getElementsByTagName-funktion sijaan. Esim.
mi = doc.getElementsByTagNameNS("http://www.w3.org/1998/Math/MathML", "mi")
Käyttämällä nimiavaruuden osaavaa versiota varmistaa, että ei ainakaan saa vahingossa tulokseen vääriä elementtejä. Eri nimiavaruuksissa voi olla samannimisiä elementtejä.
Joskus XML-dokumenteissa on myös CDATA-osioita, joiden parsiminen täytyy joillakin kirjastoilla tehdä poikkeavasti:
if node.firstChild.nodeName == "#cdata-section": print node.firstChild.data else: print node.firstChild.nodeValue
- Katso esimerkki, joka parsii ylen rss-feediä. Esimerkin Lähdekoodi.
- Tee sovellus, joka tulostaa https://www.w3.org/TR/XHTMLplusMathMLplusSVG/sample.xhtml-dokumentista kaikkien h2-tason otsikoiden tekstit
- Tulosta myös kaikkien mathml-osioiden mi-elementtien sisältö
- Tulosta myös kaikkien svg-polygonien pisteet (points)
ElementTree
Voit halutessasi opetella käyttämään myös ElementTree XML API-rajapintaa. ElementTree-rajapinnan käyttäminen on hieman yksinkertaisempaa kuin DOM-rajapinnan. ElementTree-rajapintaa tarvitset, jos joudut parsimaan rakenteeltaan rikkinäisiä html-dokumentteja (tagsoup...). Tällöin käytetään esimerkiksi BeautifulSoup-kirjastoa, joka toteuttaa ElementTree-rajapinnan.
Cloud SQL
Ei käytössä kurssilla. Voit hyödyntää omiin juttuihin.
Huom. Ei pysty käyttämään appengine-sovelluksilla, jos käyttää python 2.7 -tulkkia. Voisi periaatteessa käyttää myös users.jyu.fi:ssä olevalla sovelluksella, mutta it-palvelut on estänyt tämän. Vuoden 2019 kurssilla ei siis vielä käytetä Cloud SQL -tietokantaa. Otetaan käyttöön vuonna 2020 samalla kun siirrytään Python 3 -tulkkiin.
- Otetaan käyttöön PostgreSQL-tietokanta Googlen pilvipalvelussa.
- Valitse sama projekti kuin loit edellisellä viikolla
- Luo uusi Cloud SQL instanssi
- Valitse tietokantamoottoriksi PostgreSQL
- Valitse seuraavat asetukset. Huom! Älä missään tapauksessa paina Create-painiketta ennen kuin olet käynyt läpi myös kohdan Show configuration options-lisäasetukset
- Keksi sopiva Instance Id esim. tiea2080. Tätä ei voi myöhemmin vaihtaa.
- Keksi tietokannan ylläpitäjän salasana
- Valitse sijainniksi europe-west1 tai sama paikka minne olet sijoittanut appengine-sovelluksesi. Zone voi olla Any.
- Valitse Show configuration options
- Valitse Configure machine type and storage.
- Google tarjoaa oletuksena koneen tyypiksi 2 vcpu + 3.75 GB muistia. Tämä on aivan liian kallis konfiguraatio pelkkään testikäyttöön. Säädä sliderista Corejen määrä minimiin ja sen jälkeen myös muistin määrä minimiin eli 0.6 GB
- Valitse vielä tallennustyypiksi HDD. SSD olisi ilman muuta parempi, mutta se on myös kalliimpi. Tallennustilaksi riittää minimi eli 10 GB. Ota ruksi pois kohdasta Enable automatic storage increases
- Valitse nyt Create
Tarkempi ohje: Quickstart for Cloud SQL for PostgreSQL
- Odota instanssin valmistumista. Valitse sen jälkeen valmistunut instanssi.
- Kopioi talteen instanssisi ip-osoite ja yhteysnimi
- Kokeile ottaa yhteys tietokantaan Cloud Shellin avulla. Valitse linkki Connect using Cloud Shell
- Saat Cloud Shelliin valmiin komennon jolla voit avata yhteyden tietokantaasi Tarvitset aiemmin antamaasi ylläpitäjän salasanaa
- Nyt sinulla on käytössä psql-komentotyökalu, joka toimii samaan tapaan kuin sqlite3-tietokannan vastaava työkalu. Jos jonkun merkin syöttäminen suoraan näppäimistöltä ei onnistu niin kokeile vasemman ylänurkan näppäimistökuvakkeesta aukeavaa valikkoa ja sieltä send key combination-valintaa.
- Oletuksena sinulla ei ole palvelimessa vielä mitään tietokantaa. Luo nyt uusi tietokanta seuraavalla komennolla:
CREATE DATABASE ohjaus7 ENCODING='UTF8' LC_COLLATE='fi_FI.utf8' LC_CTYPE='fi_FI.utf8' TEMPLATE template0;
psql-työkalusta poistutaan komennolla \quit - psql-työkalua on helpompi käyttää omalta koneelta. Sama työkalu löytyy myös halava/jalava-koneista, mutta niistä on estetty yhteydet yliopiston verkon ulkopuolelle. Omaan linux-koneeseen saman työkalun saa, jos asentaa omaan koneeseen postgresql-tietokannan. Windows-koneeseen on psql-työkalu saatavilla suoraan zip-paketissa. Pura paketti esim. C:\mytemp-kansioon.
- Sallitaan yhteydet postgresql-tietokantaan omalta tietokoneelta. Siirry Connections-välilehdelle. Valitse Add network ja lisää oman koneesi ip-osoite
Jos tietokoneesi on läppäri ja siirtelet sitä verkosta toiseen niin myös ip-osoite vaihtuu ja joudut lisäämään jokaisen osoitteen erikseen tai lisäämään sallituksi isomman verkkoalueen.
- Ota nyt yhteys tietokantaasi. Käynnistä command prompt. Käynnistä edellä lataamasi psql-työkalu seuraavalla tavalla:
psql -U postgres -h oman.postgresql-palvelimen.ip.osoite -d ohjaus7
Tarvittava ip-osoite näkyy tietokantapalvelininstanssisi overview-sivulla
- Tallenna itsellesi resepti.sql-tiedosto. Lataa tämä tiedosto
psql-työkalussa komennolla:
\i resepti.sql
Nyt sinulla pitäisi olla reseptitietokanta luotuna. Käytetty sql-koodi on lähes sama kuin sqlite-tietokannan kanssa. Vain autoincrement-tyyppiset kentät on täytynyt muuttaa serial-tyyppisiksi ja triggerit on voitu jättää pois. - Jos haluat käyttää appengine-sovelluksessa postgresql-tietokantaasi niin sinun täytyy käyttää myös app engine launcherilla testatessa samaa pilvessä sijaitsevaa tietokantaa. App Engine Launcher ei osaa emuloida sql-tietokantaa lokaalilla koneella.
- Silloin kun et käytä tietokantaasi niin sammuta se. Cloud SQL -tietokanta on normaalisti jatkuvasti päällä ja kuluttaa koko ajan krediittejä. Jos et oikeasti käytä tietokantaa niin poista (delete) se kokonaan.
- Voit käsitellä tietokantaasi aivan samalla tavalla kuin sqlite3-tietokantaa. Joudut vain avaamaan tietokantayhteyden Googlen ohjeiden mukaan. Huom. ei toimi python 2.7 -sovelluksilla.
Käyttäjien kommentit