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ä (ä & kumppanit). Ilman tuota ainakin Opera ja Gecko valittavat 'undefined entity' ja kieltäytyvät parsimasta koko sivua. Lopuksi ajetaan vielä str_replace & -> &, jotta entiteetit, joita unhtmlentities/html_entity_decode eivät tunnista (ainakin –) eivät aiheuta ylimääräisiä virheilmoituksia. */ return str_replace('&', '&', 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('&', '&', 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>"; } ?>
Tällästä mä oon aiiiiiina halunnu
Todella kätevä ainakin, koodin tasosta en sano mitään, en ole vielä syvällisemmin tutustunut.
'...charset=UTF-8...' toihan ei näytä ääkkösiä oikein käytä 'charset=iso-8859-1' tota
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
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
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ä ö ja ä, jolloin ne näkyvät oikein vaikka charset onkin UTF-8
eikö tätä olis osotteena jossaki
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 :)
Nopeudesta en lupaile mitään :D
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.
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.
PHP.net manuaali kirjoitti:
utf8_decode
(PHP 3>= 3.0.6, PHP 4 , PHP 5)
Toi on ihan hyvä vaikka ite vähä sitä muuttelin ittelleni...
Kiitos paljon tosta!!
Aivan loistava, kiitos!
Voisi vielä ehkä parantaa hakemalla koko uutisen, jonka näkee siitä otsikkolinkistä.
eipä toimi.
Hienoa SysRq868, näin ne kommentit kirjoitetaan. ;)
mielettömän kätevä!
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?
Kattomalla sitä jollain RSS-lukijalla.
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
Firefoxilla käy hassusti kun klikkaa kyseisen koodin tuottamaa dokumenttia keskimmäisel napil ^_^
Eipä taida toimia enää. ^^ "Tiedostoa ... ei voitu avata."
Aihe on jo aika vanha, joten et voi enää vastata siihen.