Forumi
Home Pravila i pomoć Članovi Kalendar Današnji postovi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 03.11.2010., 17:26   #1
svebee
/
 
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
Arrow PHP & XPath

Želio bih "skinuti" ZET-ov vozni red, tj. linkove na vozne redove...stvar je da mi prozuji kroz sve linkove osim zadnjih 6, ako spremim stranicu kao .HTML i nju probam "skinuti" - sve uredno prolazi.

gdje je problem? možda u 6. linku odozdola koji sadrži "/(" u linku? to mi sad jedino pada na pamet, ali ne vidim to kao problem uglavnom ispiše sve do /media/39180/182.pdf. nakon toga - ništa.

Link je - http://www.zet.hr/autobus/dnevni.aspx

Kod je

Code:
<?php    
    $target_url = "http://www.zet.hr/autobus/dnevni.aspx";
    
    $userAgent = 'IE 6 – Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
    
    // make the cURL request to $target_url
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($ch, CURLOPT_URL,$target_url);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    $html= curl_exec($ch);
    if (!$html) {
        echo "<br />cURL error number:" .curl_errno($ch);
        echo "<br />cURL error:" . curl_error($ch);
        exit;
    }
    
    // parse the html into a DOMDocument
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    
    // grab all the on the page
    $xpath = new DOMXPath($dom);
    $hrefs = $xpath->evaluate("/html/body/div[@id='container']/div[@id='content']/div[@id='autobus']/ul/li//a");
    echo "length: " . $hrefs->length;
        
    for ($i = 0; $i < $hrefs->length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');
        echo "<br />" . ($i+1) . " | " . $url;
    }
?>

Zadnje izmijenjeno od: svebee. 03.11.2010. u 17:32.
svebee je offline   Reply With Quote
Staro 03.11.2010., 19:13   #2
zwer
crnjo
Moj komp
 
zwer's Avatar
 
Datum registracije: Mar 2003
Lokacija: Zagreb
Postovi: 1,895
Jesi probao stavit u for petlju ovako nesto:

for ($i = 0; $i < ($hrefs->length)+6 ; $i++)

pa vidi dal prolazi do kraja onda. Ako prolazi, nemam pojma koja je greska

Ali ako ni to ne radi, onda ovaj $xpath->evaluate vjerojatno ne registrira sve URLove unutar containera autobus, tj. ja sam ovako nabrzaka prebrojao 5 komada sa HR slovima, &scaron; special characterima, mozda sam fulo sesti, a to bi taman bilo tih par koji ti fale, pa zato $hrefs ima manjak linkova (pretpostavljam da je $hrefs polje URLova?).

mozes probat ovaj output sa URL-ovima izbacit u file prvo, pa onda rucno provjeri URL-ove u HTML-u i ove koje si dobio parsanjem...

Ako nisam pomogao, mozda tebi sine neka ideja
__________________
sound powered by B&W/Denon
zwer je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 03.11.2010., 22:05   #3
svebee
/
 
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
Citiraj:
Autor zwer Pregled postova
Jesi probao stavit u for petlju ovako nesto:

for ($i = 0; $i < ($hrefs->length)+6 ; $i++)

pa vidi dal prolazi do kraja onda. Ako prolazi, nemam pojma koja je greska
ma probao već to, ali evaluate ne daje više od $hrefs->length rezultata pa nema smisla povećavati.

Code:
Fatal error:  Call to a member function getAttribute() on a non-object in scrapper.php on line 33
Citiraj:
Autor zwer Pregled postova
Ali ako ni to ne radi, onda ovaj $xpath->evaluate vjerojatno ne registrira sve URLove unutar containera autobus, tj. ja sam ovako nabrzaka prebrojao 5 komada sa HR slovima, &scaron; special characterima, mozda sam fulo sesti, a to bi taman bilo tih par koji ti fale, pa zato $hrefs ima manjak linkova (pretpostavljam da je $hrefs polje URLova?).
nije problem sa HR slovima, on ih uredno izbaci van, malo šugavo (Reljkovićeva - reljkovićeva, treba podesiti encoding) ali ih izbaci, sve do nakon tog 182.pdf-a nije mi jasno...

EDIT: usput čak i ako stavim

Code:
$hrefs = $xpath->evaluate("//a");
opet fale ti zadnji linkovi...što mu smeta?

Zadnje izmijenjeno od: svebee. 03.11.2010. u 23:29.
svebee je offline   Reply With Quote
Staro 04.11.2010., 11:39   #4
doublev
the letter
Moj komp
 
doublev's Avatar
 
Datum registracije: Sep 2005
Lokacija: 127.0.0.1
Postovi: 794
Jesi probao ispisati sadržaj $dom-a (innerxml ili innerhtml ili nešto slično) pa da vidiš dali ti je dobro isparsirana stranica? Nakon toga (ako parsira dobro) bih spremio $dom u neki xml file i otvorio ga u IE-u koji ima dobar XML preglednik pa da vidiš kako ga čita. Možda ti da neki hint gdje je greška...
Niti ja ne vjerujem da je zagrada u linku problem jer se radi o atributu definiranom sa navodnicima ali ako sumnjaš na to možeš snimiti cijelu stranicu u html lokalno, izmijeniti taj link pa ga naloadati u DOM.
__________________
Exception up = new Exception("Illegal operation.");
throw up;
doublev je offline   Reply With Quote
Staro 04.11.2010., 16:39   #5
svebee
/
 
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
Citiraj:
Autor doublev Pregled postova
Jesi probao ispisati sadržaj $dom-a (innerxml ili innerhtml ili nešto slično) pa da vidiš dali ti je dobro isparsirana stranica? Nakon toga (ako parsira dobro) bih spremio $dom u neki xml file i otvorio ga u IE-u koji ima dobar XML preglednik pa da vidiš kako ga čita. Možda ti da neki hint gdje je greška...
Niti ja ne vjerujem da je zagrada u linku problem jer se radi o atributu definiranom sa navodnicima ali ako sumnjaš na to možeš snimiti cijelu stranicu u html lokalno, izmijeniti taj link pa ga naloadati u DOM.
cURL $html je dobar, sve izbaci van.

međutim da, kada izbacim DOM van - dođe taman nakon linije 182.pdf i tu stane - pozatvara sve div-ove, html i body tag.

Code:
<li><a HREF="/media/39180/182.pdf" TARGET="_blank">182 TRG MLADOSTI - ŠIBICE</a> </li></ul></li><li><span>ZAPRUÄ</span></li></ul></div></div></div></body>
</html>
svebee je offline   Reply With Quote
Staro 04.11.2010., 17:02   #6
doublev
the letter
Moj komp
 
doublev's Avatar
 
Datum registracije: Sep 2005
Lokacija: 127.0.0.1
Postovi: 794
Eto ti problema Možeš ti xpathati do besvijesti ali loadHTML ne radi dobro tj. ne parsira html do kraja. Ajde probaj ručno ukloniti onu zagradu pa ga naloadati u DOM iz datoteke... Probao bih i sam ali ne radim u PHP-u nego u .netu i vjerujem da su parseri (poprilično) drugačiji.
I da, dobrodošao u čaroban svijet parsiranja HTML-a kroz DOM

EDIT:
Sad sam tek vidio ovo:
Code:
<span>ZAPRUÄ</span>
Možda se ipak bori sa hrvatskim znakovljem... Ne mislim zbog čudnog znaka (makar je i to neki hint) nego po tome što mu je to zadnji znak prije kojeg je krenuo zatvarati sve otvorene tagove. Očito mu je to draže nego dignuti exception... Kao što sam napisao, ne poznajem PHP DOM parser ali možda je problem u encodingu u kojem je stranica napisana i encodingu kojeg DOM parser očekuje... Jel ima neki parametar preko kojeg mu to možeš podesiti?
__________________
Exception up = new Exception("Illegal operation.");
throw up;

Zadnje izmijenjeno od: doublev. 04.11.2010. u 17:08.
doublev je offline   Reply With Quote
Staro 04.11.2010., 17:48   #7
svebee
/
 
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
Citiraj:
Autor doublev Pregled postova
Kao što sam napisao, ne poznajem PHP DOM parser ali možda je problem u encodingu u kojem je stranica napisana i encodingu kojeg DOM parser očekuje... Jel ima neki parametar preko kojeg mu to možeš podesiti?
tako je, encoding je zezao, sada radi sve kako treba

Code:
    $dom = new DOMDocument();
    $html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
    @$dom->loadHTML($html);
pa eto ako netko ubuduće nešto parsira na ovaj način, obavezno uključiti ovaj dio
svebee je offline   Reply With Quote
Staro 05.11.2010., 00:12   #8
msvrtan
..
 
Datum registracije: Oct 2001
Lokacija: Zagreb
Postovi: 2,735
zasto ne regex-om ih izvuci van?
msvrtan je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori



Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na