|
03.11.2010., 17:26 | #1 |
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
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. |
03.11.2010., 19:13 | #2 |
crnjo
Datum registracije: Mar 2003
Lokacija: Zagreb
Postovi: 1,901
|
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, š 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 |
|
|
Oglas
|
|
03.11.2010., 22:05 | #3 | ||
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
Citiraj:
Code:
Fatal error: Call to a member function getAttribute() on a non-object in scrapper.php on line 33 Citiraj:
EDIT: usput čak i ako stavim Code:
$hrefs = $xpath->evaluate("//a"); Zadnje izmijenjeno od: svebee. 03.11.2010. u 23:29. |
||
04.11.2010., 11:39 | #4 |
the letter
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; |
04.11.2010., 16:39 | #5 | |
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
Citiraj:
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> |
|
04.11.2010., 17:02 | #6 |
the letter
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>
__________________
Exception up = new Exception("Illegal operation."); throw up; Zadnje izmijenjeno od: doublev. 04.11.2010. u 17:08. |
04.11.2010., 17:48 | #7 | |
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
Citiraj:
Code:
$dom = new DOMDocument(); $html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"); @$dom->loadHTML($html); |
|
05.11.2010., 00:12 | #8 |
..
Datum registracije: Oct 2001
Lokacija: Zagreb
Postovi: 2,735
|
zasto ne regex-om ih izvuci van? |
|
|
Oglas
|
|
|
|