2010-08-04 10 views
6

sto "tentando" per raschiare una pagina web che ha le seguenti strutture all'interno della pagina:Come analizzare l'HTML effettivo dalla pagina utilizzando CURL?

<p class="row"> 
    <span>stuff here</span> 
    <a href="http://www.host.tld/file.html">Descriptive Link Text</a> 
    <div>Link Description Here</div> 
</p> 

Sto raschiando il pagina web utilizzando ricciolo:

<?php 
    $handle = curl_init(); 
    curl_setopt($handle, CURLOPT_URL, "http://www.host.tld/"); 
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
    $html = curl_exec($handle); 
    curl_close($handle); 
?> 

Ho fatto qualche ricerca e ha scoperto che non dovrei usare un RegEx per analizzare il codice HTML che viene restituito dal ricciolo e che dovrei usare DOM PHP. Questo è il modo che ho fatto questo:

$newDom = new domDocument; 
$newDom->loadHTML($html); 
$newDom->preserveWhiteSpace = false; 
$sections = $newDom->getElementsByTagName('p'); 
$nodeNo = $sections->length; 
for($i=0; $i<$nodeNo; $i++){ 
    $printString = $sections->item($i)->nodeValue; 
    echo $printString . "<br>"; 
} 

Ora non sto fingendo di avere capito bene questo, ma ho il senso, e io capisco sezioni sto volendo. L'unico problema è che quello che ottengo è solo il testo della pagina HTML, come se l'avessi copiato dalla mia finestra del browser. Quello che voglio è il codice HTML vero e proprio perché voglio estrarre i collegamenti e le uso anche, in questo modo:

for($i=0; $i<$nodeNo; $i++){ 
    $printString = $sections->item($i)->nodeValue; 
    echo "<a href=\"<extracted link>\">LINK</a> " . $printString . "<br>"; 
} 

Come potete vedere, non riesco a ottenere il link perché sto ottenendo soltanto il testo della pagina web e non la fonte , come voglio. So che "curl_exec" sta tirando l'HTML perché ho provato proprio questo, quindi credo che il DOM stia in qualche modo spogliando l'HTML che voglio.

risposta

4

Secondo commenti su the PHP manual on DOM, si dovrebbe utilizzare il seguente all'interno del vostro ciclo:

$tmp_dom = new DOMDocument(); 
    $tmp_dom->appendChild($tmp_dom->importNode($sections->item($i), true)); 
    $innerHTML = trim($tmp_dom->saveHTML()); 

questo imposterà $innerHTML essere il contenuto HTML del nodo.

Ma credo che ciò che si vuole veramente è quello di ottenere la 'a' nodi sotto il nodo 'p', in modo da fare questo:

$sections = $newDom->getElementsByTagName('p'); 
$nodeNo = $sections->length; 
for($i=0; $i<$nodeNo; $i++) { 
    $sec = $sections->item($i); 
    $links = $sec->getElementsByTagName('a'); 
    $linkNo = $links->length; 
    for ($j=0; $j<$linkNo; $j++) { 
     $printString = $links->item($j)->nodeValue; 
     echo $printString . "<br>"; 
    } 
} 

questo sarà solo stampare il corpo di ogni link.

+0

È inoltre possibile scorrere i nodi utilizzando 'foreach' al posto delle anse' for'. Ciò lo renderà più compatto e comprensibile, dal momento che in realtà non sembra (sembra) necessario alcuno degli indici. – janmoesen

0

potresti voler dare un'occhiata a phpQuery per eseguire operazioni di parsing HTML sul lato server. basic example

1

È possibile passare un nodo a DOMDocument::saveXML(). Prova questo:

$printString = $newDom->saveXML($sections->item($i));

+0

Sì, questo restituirà in modo efficace il 'outerHTML' del nodo – Gordon

+0

Apparentemente, il poster voleva il codice HTML interno, non quello esterno. Non è stato chiaro per me, ma lascerò comunque la mia risposta per il riferimento "saveXML'. – janmoesen

Problemi correlati