Google Docs scraperina (ImportXML)

Paul Bradshawn kirjan innoittamana pieni johdatus Google-dokumenttien taulukkolaskimen toimintaan. Google Drive (entinen Google Docs) osaa Taulukkolaskenta-sovelluksessaan hakea tietoa taulukkoon nettisivuilta. Tämän tutoriaalin esimerkkitiedosto on tarkasteltavissa täällä.

=importHtml-funktio hakee annetusta verkko-osoitteesta taulukkoja tai listoja. Taulukot ovat sitä tietoa, mikä on html-koodissa <table> ja </table> -tagien välissä. Listat taas löytyvät <ul>, <ol> ja <dl> -tagien välistä.

Nyt keskitymme kuitenkin =ImportXML-funktioon, joka on monipuolisempi ja osaa hakea tietoa mm. html- ja xml-sivuilta ja .csv-tiedostoista.

Halusin tätä sivua varten listan Julkisuuslain pykälöiden otsikoista. Pykäli on 38, joten olisin voinut myös copy-pastettaa ne, mutta näin homma kävi nopeammin. Jos olisin sattunut haluamaan Rikoslaista rikosnimikkeet, olisi niiden leikkaaminen ja liimaaminen alkanut jo käydä työstä ilman tällaista menetelmää.

Google Laskentataulukossa funktio luodaan kirjoittamalla soluun = (on yhtä kuin) -merkki. Se kertoo sovellukselle, että tulossa on funktio, eikä solun arvo. Funktiot ovat muoto =FunktionNimi(parametri, parametri, parametri…)

FunktionNimi kertoo mitä tehdään, parametrit mille tehdään ja joskus vielä miten tehdään (mikäli funktiossa on useampia vaihtoehtoja).

=ImportXML(”http://www.finlex.fi/fi/laki/ajantasa/1999/19990621″; ”//h5[@class=’ot’]”)

  • =ImportXML hakee halutut tiedot ja esittää jokaisen omalla rivillään
  • ensimmäinen parametri on verkko-osoite, josta tietoa haetaan. Se tulee lainausmerkkien sisään.
  • parametrit erotetaan toisistaan puolipisteellä (;). Huom! Mikäli laskentataulukon maa-asetukseksi on säädetty esim. Yhdysvallat, korvataan puolipiste pilkulla (,). Tarkista tämä valikosta Tiedosto > Maakohtaiset asetukset.
  • jälkimmäinen parametri kertoo, että haetut tiedot löytyvät <h5>-tagin sisältä silloin, kun tagilla on attribuutti class=”ot”. Huom! Vaikka verkkosivun lähdekoodissa attribuutti on kirjoitettu lainausmerkeillä, tulee se Googleen heittopilkuilla.

Kun verkkosivun lähdekoodista löytyy esimerkiksi teksti <h5 class=”ot”>Julkisuusperiaate</h5>, kirjoittaa funktiomme soluun sanan ”Julkisuusperiaate”. Sinä et tiedä, että pykälien otsikot on tuolla tavalla merkitty, mutta minä tiedän. Voit itsekin varmistaa asian menemällä Finlexin sivulle ja tarkistamalla lähdekoodin.

<h5 class=”ot”>Julkisuusperiaate</h5>
<p class=”py”>Viranomaisten asiakirjat ovat julkisia, jollei tässä tai muussa laissa erikseen toisin säädetä.</p>
<p class=”py”>Oikeudesta seurata eduskunnan täysistuntoa, valtuuston ja muiden kunnallisten toimielinten kokouksia sekä tuomioistuinten ja kirkollisten toimielinten istuntoja säädetään erikseen.</p>

Tältä sivun lähdekoodi näyttää. Niinpä kirjoitamme funktiomme Google-taulukkoon tyhjään kenttään.

Kun painat enteriä, alkaa Google Laskentataulukko hakea tietoja. Se tulostaa jokaisen löytämänsä <h5 class=”ot”> ja </h5> -tagien sisältä löytämänsä tekstin omalle rivilleen.

Voimme vaihtaa funktion poimimaan esimerkiksi Rikoslain kaikki pykälät.

Jos into riittää, niin voit kopioida samalla tavalla vaikka kansanedustajien blogien osoitteet. Ne löytyvät tältä verkkosivulta: http://web.eduskunta.fi/Resource.phx/eduskunta/organisaatio/kansanedustajat/blogit.htx

Lähdekoodista löytyy tällaisia linkkejä:

<A href=”http://www.sauliahvenjarvi.puheenvuoro.uusisuomi.fi/” target=_blank>Blogi</A>

Muokataan siis funktiotamme poimimaan oikeat asiat:

=ImportXML(”http://www.finlex.fi/fi/laki/ajantasa/1999/19990621″; ”//h5[@class=’ot’]”)

Vaihdetaan osoite:

=ImportXML(”http://web.eduskunta.fi/Resource.phx/eduskunta/organisaatio/kansanedustajat/blogit.htx”; ”//h5[@class=’ot’]”)

Vaihdetaan tagi ja attribuutti. Nyt on huomattava, että jos teemme, kuten intuitio ehkä neuvoisi ja kirjoitamme funktion…

=ImportXML(”http://web.eduskunta.fi/Resource.phx/eduskunta/organisaatio/kansanedustajat/blogit.htx”; ”//a[@href]”)

…saamme tulokseksi listan sanoja Blogi. Se johtuu siitä, että href=verkko-osoite -attribuutilla varustettujen <a> ja </a> -tagien välissä lukee aina sana ”Blogi”. Emme halua hakea sitä, vaan href-attribuutille annettuja arvoja, eli verkko-osoitteita, joihin linkit ohjaavat. Se tapahtuu näin:

=ImportXML(”http://web.eduskunta.fi/Resource.phx/eduskunta/organisaatio/kansanedustajat/blogit.htx”; ”//@href”)

Älä hämmenny, kun saat ensimmäisille riveille kaikkea asiaankuulumatonta. Funktio hakee sivun kaikki linkit, ei pelkästään Blogi-linkkejä. Listan loppupäästä löytyvät kuitenkin kaikkien blogien osoitteet.

07. elokuu 2012 by Jarno Liski
Categories: Tutoriaalit | Tags: , , , , | Leave a comment

Leave a Reply

Required fields are marked *