PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   PHP & XPath (https://forum.pcekspert.com/showthread.php?t=201998)

svebee 03.11.2010. 17:26

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 :stoopid: 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:

    $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 "cURL error number:" .curl_errno($ch);
        echo "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 "" . ($i+1) . " | " . $url;
    }
?>

:beer:

zwer 03.11.2010. 19:13

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 :D

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, š 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 :goood::beer:

svebee 03.11.2010. 22:05

Citiraj:

Autor zwer (Post 1769038)
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 :D

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 (Post 1769038)
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, š 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 :stoopid: nije mi jasno...

EDIT: usput čak i ako stavim

Code:

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

doublev 04.11.2010. 11:39

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.

svebee 04.11.2010. 16:39

Citiraj:

Autor doublev (Post 1769590)
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.



:stoopid:

doublev 04.11.2010. 17:02

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:

ZAPRUÄ
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?

svebee 04.11.2010. 17:48

Citiraj:

Autor doublev (Post 1769868)
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 :beer:

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 :)

msvrtan 05.11.2010. 00:12

zasto ne regex-om ih izvuci van?


Sva vremena su GMT +2. Sada je 18:17.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger