Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Regexp, ongelma toiston kanssa

kayttaja-2791 [23.01.2012 13:41:09]

#

Hei

Haen ylen sivuilta ohjelmatietoja (uudesta) tv-oppaasta, mutta nyt ei oikein pää luista. Sivuilla on olemassa käytännössä kaksi tapaa näyttää ohjelma, riippuen onko sillä kuvausta vaiko ei:

Kuvaus:

<abbr class="datetime time start" title="2012-01-23T10:46:15+02:00"><em class="time">10.46</em></abbr>            <span class="label ondemand unavailable ver-s"><em>Ei oikeuksia</em></span>        </span>
        <h3>
          <a href="/ohjelmat/959481">Rakennustaiteen helmiä</a>
           <span class="label rerun">Uusinta</span>        </h3>

<a class="view-episode" href="/ohjelmat/959481"></a>                <p>Aurinkotemppeli. Intia. Ihmiskäden muovaamia huomattavia rakennelmia löytyy kaikkialta maailmasta. BBC:n lyhytohjelmasarja esittelee hienoimpia saavutuksia.</p>

Ilman kuvaus:

 <abbr class="datetime time start" title="2012-01-23T11:00:00+02:00"><em class="time">11.00</em></abbr>                    </span>

        <h3>
          <a href="/ohjelmat/1338487">Tv-uutiset</a>
                  </h3>

<a class="view-episode" href="/ohjelmat/1338487"><img alt="" src="http://areena.yle.fi/resized/x212/yle.fi/progressive/areena2/img/2012/1/23/1327309995338_1327309995352.jpg" /><span class="label ondemand available"><em>Katso nyt netissä, aikaa <span class="relative-time"><em>30 vuorokautta</em></span></em></span></a>

Eli lopussa on <p>Ohjelman tarkempi kuvaus</p>, tai sitten se puuttuu kokonaan.

Isoin ongelma on kuvauksen puuttuminen, ohjelman saatavuus Areenassa on tieto jolla en tee mitään. Nyt saan kyllä kaikki ohjelmat joissa on kuvaus seuraavalla koodinpätkällä:

<?php
$lähdekoodi = file_get_contents("http://yle.fi/ohjelmat/tv/tv1");
preg_match_all("/<em class=\"time\">(.*)<\/em>.*<h3>\s*(.*)\s*(<span class=\"label rerun\">Uusinta<\/span>)*\s*<\/h3>.*<p>(.*)<\/p>.*<div/msU", $lähdekoodi, $preg_osumat);

print_r($preg_osumat);
?>

Mutta toisaalta kun yritän laittaa kuvaukselle toistomahdollisuutta 0, eli ettei se olisi pakollinen laittamalla sulut <p> -roskan ympärille ja laittamalla toistoiksi * (eli 0-ääretön kertaa), ei se enään toimikaan, palauttaa vain tyhjää kuvaukseksi aina. Tätä en käsitä miksei se toimi:

<?php
$lähdekoodi = file_get_contents("http://yle.fi/ohjelmat/tv/tv1");
preg_match_all("/<em class=\"time\">(.*)<\/em>.*<h3>\s*(.*)\s*(<span class=\"label rerun\">Uusinta<\/span>)*\s*<\/h3>.*(<p>(.*)<\/p>)*.*<div/msU", $lähdekoodi, $preg_osumat);

print_r($preg_osumat);
?>

Pieni tönäisy oikeaan suuntaan olisi iso helpotus tässä vaiheessa :)

Luvat on kyllä haettu ohjelmatietojen hakemiseen ja käyttämiseen Yleisradiolta, joten sen suhteen voi potentiaaliset auttajat olla huoleti :)

tuutti [23.01.2012 15:07:02]

#

http://blogit.yle.fi/kehitys-kehittyy/ylen-avoin-data-rajapinta-ylen-teksti-tvhen

Yksi vaihtoehto (en oo testannu, mutta luulis, että saisi tv-ohjelmat myös tuota kautta.)

kayttaja-2791 [23.01.2012 15:35:08]

#

tuutti kirjoitti:

http://blogit.yle.fi/kehitys-kehittyy/ylen-avoin-data-rajapinta-ylen-teksti-tvhen

Yksi vaihtoehto (en oo testannu, mutta luulis, että saisi tv-ohjelmat myös tuota kautta.)

Mielenkiintoista kyllä, koko Ylen "avoin data"-hanke. Huomasin sen hypetyksen myös ohjelmaoppaan info-sivulla, hämäräksi vain jäi miten se nyt liittyi uudistukseen, kun mitään järkevää APIa ei ainakaan ohjelmatietojen saatavuuteen ole julkistettu (ja lisäksi uusi sivu on paljon vaikeampi parsia kuin vanha mobiilisivusto).

Valitettavasti tuo teksti-tv idea ei käy, koska se ei tarjoa kuvauksia ohjelmista, vaan pelkät nimet.

Metabolix [23.01.2012 16:12:13]

#

Tiedot on helpompi hakea useammalla lausekkeella:

<?php
$ohjelmat = array();
$lähdekoodi = file_get_contents("http://yle.fi/ohjelmat/tv/tv1");
preg_match_all('`<li id="lahetys-.*?</li>`s', $lähdekoodi, $osumat);
foreach ($osumat[0] as $osuma) {
	$ohjelmat[] = $ohjelma = new stdClass();
	if (preg_match('`<em class="time">(.*?)</em>`s', $osuma, $tmp)) {
		$ohjelma->aika = $tmp[1];
	}
	if (preg_match('`<h3>\\s*(?:<a.*?>\\s*)?(.*?)\\s*<`s', $osuma, $tmp)) {
		$ohjelma->nimi = $tmp[1];
	}
	if (preg_match_all('`<span class="label.*?>(.*?)</span>`s', $osuma, $tmp)) {
		foreach ($tmp[1] as $tmp) {
			$ohjelma->lisatiedot[] = trim(strip_tags($tmp));
		}
	}
	if (preg_match('`<p>(.*?)</p>`s', $osuma, $tmp)) {
		$ohjelma->kuvaus = $tmp[1];
	}
}

kayttaja-2791 [24.01.2012 21:52:53]

#

Metabolix, oikeassa varmastikin olet. Elegantin toteutuksenkin annoit, kiitoksia paljon siitä, hyvin toimii :)

_Pete_ [25.01.2012 08:20:24]

#

Asiaan liittyen, itse kyllästyin jo kauan siihen että sivut josta tv-tiedot muuttuvat vähintään X kertaa vuodessa. Siksi omassa ohjelmointiprojektissa ulkoistin tämän säädön linuxissa toimivaan tv_grab_fi joka löytyy xmltv paketista.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta