errore di analisi php proDOM

Sto usando il seguente codice per analizzare il documento dom ma alla fine ottengo l'errore "google.ac" è nullo o no una linea object 402 char 1

Quello che immagino, la row 402 contiene tag e un sacco di ";", Come posso risolvere questo?

<?php //$ch = curl_init("http://images.google.com/images?q=books&tbm=isch/"); // create a new cURL resource $ch = curl_init(); // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, "http://images.google.com/images?q=books&tbm=isch/"); curl_setopt($ch, CURLOPT_HEADER, 0); // grab URL and pass it to the browser $data = curl_exec($ch); curl_close($ch); $dom = new DOMDocument(); $dom->loadHTML($data); //@$dom->saveHTMLFile('newfolder/abc.html') $dom->loadHTML('$data'); // find all ul $list = $dom->getElementsByTagName('ul'); // get few list items $rows = $list->item(30)->getElementsByTagName('li'); // get anchors from the table $links = $list->item(30)->getElementsByTagName('a'); foreach ($links as $link) { echo "<fieldset>"; $links = $link->getElementsByAttribute('imgurl'); $dom->saveXML($links); } ?> 

Ci sono alcuni problemi con il codice:

  1. Dovresti aggiungere l'opzione CURL – CURLOPT_RETURNTRANSFER – per catturare l'output. Per impostazione predefinita, l'output è visualizzato sul browser. In questo modo: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); . Nel codice sopra, $data saranno sempre VERO o FALSO ( http://www.php.net/manual/en/function.curl-exec.php )

  2. $dom->loadHTML('$data'); non è corretto e non richiesto

  3. Il metodo di lettura dei tag 'li' e 'a' potrebbe non essere corretto perché $ list-> item (30) punterà sempre al 30esimo elemento

Comunque, venendo alle correzioni. Non sono sicuro di aver controllato l'HTML restituito dalla richiesta CURL, ma sembra diverso da ciò che abbiamo discusso nel post originale . In altre parole, l'HTML restituito da CURL non contiene gli elementi <ul> e <li> . Invece contiene elementi <td> e <a> .

Add-on : non sono molto sicuro del perché HTML per la stessa pagina sia diverso quando viene visto dal browser e se letto da PHP. Ma ecco un ragionamento che penso possa andare bene. La pagina utilizza il codice JavaScript che esegue il rendering di alcuni codici HTML dynamicmente al caricamento della pagina. Questo HTML dinamico può essere visto quando viene visualizzato dal browser ma non da PHP. Quindi, presumo che i <ul> e <li> siano generati dynamicmente. Ad each modo, per ora non ci preoccupiamo.

Pertanto, è necessario modificare il codice per analizzare gli elementi <a> e quindi leggere gli URL dell'image. Questo snippet di codice potrebbe aiutare:

 <?php $ch = curl_init(); // create a new cURL resource // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, "http://images.google.com/images?q=books&tbm=isch/"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $data = curl_exec($ch); // grab URL and pass it to the browser curl_close($ch); $dom = new DOMDocument(); @$dom->loadHTML($data); // avoid warnings $listA = $dom->getElementsByTagName('a'); // read all <a> elements foreach ($listA as $itemA) { // loop through each <a> element if ($itemA->hasAttribute('href')) { // check if it has an 'href' attribute $href = $itemA->getAttribute('href'); // read the value of 'href' if (preg_match('/^\/imgres\?/', $href)) { // check that 'href' should begin with "/imgres?" $qryString = substr($href, strpos($href, '?') + 1); parse_str($qryString, $arrHref); // read the query parameters from 'href' URI echo '<br>' . $arrHref['imgurl'] . '<br>'; } } } 

Spero che abbia senso. Ma tieni presente che l'analisi precedente potrebbe non riuscire se Google modifica il codice HTML.