Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Hesari RSS-feedi

Sivun loppuun

Blaze [25.05.2004 21:58:59]

#

Se ainoa taho, jolta sitä kaipaisin, ei tarjoa RSS-feedia, joten ajattelin tehdä asialle jotain :> Tuloksena tämä PHP-skripti, joka koostaa Hesarin purkka-HTML:stä siistin RSS-feedin.

Uutta v1.0 (20040526):
-Homma toimii nyt, niinkuin se alunperinkin olisi pitänyt tehdä, eli sivulta haetaan niin monta juttua, kuin siellä on, eikä yritetä arpoa jotain kiinteää lukua.
-Sylkee nyt ISO-8859-15:sta (ISO-8859-1 + euromerkki) Linkun hilj... mieliksi ^_^;;
-juttuja -parametri sai lähteä. Nyt haetaan suoraan kaikki jutut.

Uutta v1.0.1 (20040607):
-Quick&dirty korjaus siihen vaivaan, että html_entity_decode ei osaakkaan dekoodata kaikkia entiteettejä...
-Toimii nyt antiikkisillakin PHP:n versioilla

Livenä osoitteessa http://pp.kpnet.fi/blaze/rss/hsrss.php

<?php
	/*	hsrss.php v. 1.0.1	Copyright © 2004 Karri "Blaze" Kahelin
	*
	*	Parsii RSS-feedin Hesarin purkkakoodista.
	*
	*	Get-parametrit:
	*	teksti: 1=linkit tekstiversioon, 0=linkit graafiseen versioon (oletus)
	*/
	header('Content-Type: text/xml; charset=ISO-8859-15');
	/*header('Content-Type: text/plain; charset=ISO-8859-15'); //Oiva testausta varten */

	/* Haetaan purkka Hesarin palvelimelta */
	$material = getURLContents('http://www.helsinginsanomat.fi/teksti/tuoreet/aikajarjestys/');

	/* Tarkistellaan, annettiinko parametreja, jos ei, isketään oletukset kehiin */
	if(!isset($_GET['teksti'])) {
		$textv = 0;
	} else {
		$textv = $_GET['teksti'];
	}

	/* Tulostetaan "pakolliset kuviot" ennen varsinaisia <item>-elementtejä */
	printHeader();
	/* Tulostetaan <item>-elementit sisältöineen */
	$i = 0;
	while($returnValue != -1) {
		$returnValue = printItem ($i);
		$i++;
	}
	/* Tulostetaan pari lopetustagia */
	printFooter();

	/* Korvaa html_entity_decode:n PHP < 4.3.0:lla
	   Napsaistu osoitteesta https://www.php.net/manual/fi/function.html-entity-decode.php */
	function unhtmlentities($string) {
		$trans_tbl = get_html_translation_table(HTML_ENTITIES);
		$trans_tbl = array_flip($trans_tbl);
		return strtr($string, $trans_tbl);
	}

	function getURLContents ($URL) {
		$fileHandle = fopen($URL, 'r');
		if(!$fileHandle){
			/* Hups! */
			header('Content-Type: text/plain; charset=ISO-8859-15');
			echo "Tiedostoa $URL ei voitu avata.";
			exit(1);
		}
		/* Luetaan sivun sisältö 1024 tavua kerrallaan */
		while(!feof($fileHandle)) {
			$material .= fgets($fileHandle, 1024);
		}
		fclose($fileHandle);
		return $material;
	}

	function getStoryPos($ordinal) {
		global $material;
		$pos = 0;
		/* Loopataan, kunnes oikea juttu sattuu kohdalle */
		for ($i = 0; $i <= $ordinal; $i++){
			$pos = strpos($material, '<p class="pro85">', $pos) + 17;
		}
		$temp = ord(substr($material, $pos, 1));
		/* Jos $pos:a seuraava merkki ei kapitaali aakkonen (HS näyttää kirjoittavan nuo "KOTIMAA", "ULKOMAAT" jne. isolla),
		   ollaan menty viimeisen jutun ohi. Ei kyllä ihan idioottivarma tarkistus, mutta ainakin toistaiseksi tuntuu toimivan.
		   *crosses fingers* */
		if(((64 < $temp) && ($temp < 91))) {
			return $pos;
		} else {
			return -1;
		}
	}

	function getCategory($pos) {
		global $material;
		return substr($material, $pos ,strpos($material, '</p>', $pos) - $pos);
	}

	function getLink($pos) {
		global $material, $textv;
		$pos = strpos($material, 'href="', $pos) + 6;
		if($textv == 1) {
			return 'http://www.helsinginsanomat.fi' . substr($material, $pos, strpos($material, '"', $pos) - $pos);
		} else {
			/* Jos linkit graafiseen versioon, niin parsitaan "/teksti" (7 merkkiä) mjonon alusta pois */
			$pos += 7;
			return 'http://www.helsinginsanomat.fi' . substr($material, $pos, strpos($material, '"', $pos) - $pos);
		}
	}

	function getTitle($pos) {
		global $material;
		$pos = strpos($material, 'class="pro95"><b>', $pos) + 17;
		/* Hesarin sivut ovat UTF-8:aa, mutta näyttävät kuitenkin koodaavan ainakin ääkköset entiteetteinä .
		   Siltä varalta kuitenkin, että joukossa oikeasti olisi ei-ASCII -merkkejä ajamme tavaran utf8_decoden läpi.
		   html_entity_decodea taas tarvitaan, koska XML:ssä ei ole määritelty nimettyjä entiteettejä (&auml; & kumppanit).
		   Ilman tuota ainakin Opera ja Gecko valittavat 'undefined entity' ja kieltäytyvät parsimasta koko sivua.
		   Lopuksi ajetaan vielä str_replace & -> &amp;, jotta entiteetit, joita unhtmlentities/html_entity_decode eivät
		   tunnista (ainakin &ndash;) eivät aiheuta ylimääräisiä virheilmoituksia. */
		return str_replace('&', '&amp;', unhtmlentities(utf8_decode(strip_tags(substr($material, $pos, strpos($material, '<br>', $pos) - $pos)))));
	}

	function getStory($pos) {
		global $material;
		$pos = strpos($material, '<span class="pro95">', $pos) + 20;
		/* Sama täällä */
		return str_replace('&', '&amp;', unhtmlentities(utf8_decode(substr($material, $pos, strpos($material, '</span>', $pos) - $pos))));
	}

	function printHeader() {
		echo "<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>\n";
		echo "<rss version=\"2.0\">\n";
		echo "\t<channel>\n";
		echo "\t\t<title>HS Verkkoliite - Tuoreimmat uutiset</title>\n";
		echo "\t\t<link>http://www.helsinginsanomat.fi/tuoreet/</link>\n";
		echo "\t\t<description>Helsingin Sanomien Verkkoliite. Tuoreimmat uutiset aamusta iltaan.</description>\n";
		echo "\t\t<language>fi</language>\n";
		echo "\t\t<copyright>Copyright 2004 Helsingin Sanomat Verkkoliite</copyright>\n";
		echo "\t\t<generator>hsrss.php v.1.0.1</generator>\n";
		echo "\t\t<category>Newspapers</category>\n";
		echo "\t\t<docs>http://blogs.law.harvard.edu/tech/rss/</docs>\n";
	}

	function printItem($ordinal) {
		$pos = getStoryPos($ordinal);
		if($pos != -1) {
			echo "\t\t<item>\n";
			echo "\t\t\t<category>" . getCategory($pos) . "</category>\n";
			echo "\t\t\t<link>" . getLink($pos) . "</link>\n";
			echo "\t\t\t<title>" . getTitle($pos) . "</title>\n";
			echo "\t\t\t<description>" . getStory($pos) . "</description>\n";
			echo "\t\t</item>\n";
		}
		return $pos;
	}

	function printFooter() {
		echo "\t</channel>\n";
		echo "</rss>";
	}
?>

Gwaur [25.05.2004 23:56:39]

#

Tällästä mä oon aiiiiiina halunnu

Turambar [26.05.2004 12:43:22]

#

Todella kätevä ainakin, koodin tasosta en sano mitään, en ole vielä syvällisemmin tutustunut.

Linkku [26.05.2004 12:53:41]

#

'...charset=UTF-8...' toihan ei näytä ääkkösiä oikein käytä 'charset=iso-8859-1' tota

Uniikki [26.05.2004 14:49:44]

#

Kun yritin testiajaa tota sun koodia se anto tollasen ilmotuksen. Mitä meinaa mistä lie johtunee?
_________________________________
The XML page cannot be displayed

Reference to undefined entity 'auml'. Line 163, Position 461

Blaze [26.05.2004 17:23:23]

#

lainaus:

koodin tasosta en sano mitään, en ole vielä syvällisemmin tutustunut.

No siitä en minäkään mene sanomaan mitään ^^;;

lainaus:

'...charset=UTF-8...' toihan ei näytä ääkkösiä oikein käytä 'charset=iso-8859-1' tota

Et tainnut testata? Ääkköset nimittäin näkyy oikein loistavasti ainakin minulla (klienttinä Opera).

lainaus:

Kun yritin testiajaa tota sun koodia se anto tollasen ilmotuksen. Mitä meinaa mistä lie johtunee?

Tuo johtuu siitä, että parserista pääsee läpi Hesarin purkkaa. Ja keksin juuri, miksi sitä pääsee: kuinkas ollakkaan, uutisten määrä sivulla ei olekaan vakio, kutebn olettaa voisi. Tätä kirjoittaessa siellä on 23, kun eilen illalla oli 29 juttua.

Ai, kun kivaa. Pitänee soodata tuohon joku tunnistin, ettei se suolla tuota wannabe-HTML:ää käyttäjälle asti.

Sillä aikaa homma korjaantuu pistämällä querystringiksi ?juttuja=jokusopivanpieniarvo

Linkku [26.05.2004 18:02:12]

#

lainaus:

lainaus:

'...charset=UTF-8...' toihan ei näytä ääkkösiä oikein käytä 'charset=iso-8859-1' tota

Et tainnut testata? Ääkköset nimittäin näkyy oikein loistavasti ainakin minulla (klienttinä Opera).

[/lainaus]

En testannut. Mutta oletin että helsinginsanomien sivulla ääkköset ovat muodossa ä ja ö eivätkä &ouml; ja &auml;, jolloin ne näkyvät oikein vaikka charset onkin UTF-8

mamaze [27.05.2004 19:45:59]

#

eikö tätä olis osotteena jossaki

Blaze [27.05.2004 20:18:04]

#

lainaus:

eikö tätä olis osotteena jossaki

Ei, koska tuo ei halua toimia ISP:ni palvelimen antiikkisella PHP:n versiolla (ajan sitä oman desktoppini Apachella).

Jos joku haluaa tukkia tuon jollekin yleisessä käytössä olevalle palvelimelle, niin olkoot hyvä vaan. URLia saa kertoa tänne :)

shinmai [28.05.2004 09:42:42]

#

http://hs.subexit.com/

Nopeudesta en lupaile mitään :D

lahtis [30.06.2004 19:35:50]

#

ei toimi edes uusimmalla apachellakaan.

Fatal error: Call to undefined function: utf8_decode() in /var/www/html/rss-feeds/hsrss.php on line 101

mitenhän tuon saisi toimiin.

Blaze [30.06.2004 21:24:36]

#

Tjaa-a, minulla se toimii (Apache/2.0.48 (Win32) PHP/4.3.4), kuten myös ISP:n palvelimella (Apache/1.3.27 (Unix) (Red-Hat/Linux) mod_ssl/2.8.12 OpenSSL/0.9.6 PHP/
4.1.2)

Voit koittaa nappaista tuon utf8_decode():n pois tuosta välistä. Se saattaa jopa toimia vielä sen jälkeen.

tsuriga [08.07.2004 20:04:17]

#

PHP.net manuaali kirjoitti:

utf8_decode
(PHP 3>= 3.0.6, PHP 4 , PHP 5)

Thony [21.07.2004 14:04:17]

#

Toi on ihan hyvä vaikka ite vähä sitä muuttelin ittelleni...
Kiitos paljon tosta!!

Sir McDuck [18.08.2004 19:15:41]

#

Aivan loistava, kiitos!

Voisi vielä ehkä parantaa hakemalla koko uutisen, jonka näkee siitä otsikkolinkistä.

SysRq868 [06.09.2004 18:58:50]

#

eipä toimi.

Gwaur [06.09.2004 20:02:41]

#

Hienoa SysRq868, näin ne kommentit kirjoitetaan. ;)

miiro [08.01.2005 18:59:27]

#

mielettömän kätevä!

Maxfacus [22.02.2005 21:37:28]

#

Toi *** Listaus 1 tuotti kyllä uutisia, mutta kaikki yhdessä kasassa, ei siis mitään erittelyä. Eli miten tämä saa näyttöön selkeäksi?

Blaze [22.02.2005 21:49:37]

#

Kattomalla sitä jollain RSS-lukijalla.

esakom [21.06.2005 08:28:29]

#

lainaus:

Se ainoa taho, jolta sitä kaipaisin, ei tarjoa RSS-feedia, joten ajattelin tehdä asialle jotain

nyt se tarjoaa:
http://siirto.helsinginsanomat.fi/aukio/HS-Tuoreet-RSS.xml

Tzaeru [29.12.2005 04:41:50]

#

Firefoxilla käy hassusti kun klikkaa kyseisen koodin tuottamaa dokumenttia keskimmäisel napil ^_^

Metabolix [07.12.2011 14:12:25]

#

Eipä taida toimia enää. ^^ "Tiedostoa ... ei voitu avata."


Sivun alkuun

Vastaus

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

Tietoa sivustosta