2012-01-15 65 views
0

我使用下面的代碼解析DOM文檔,但最後我得到的錯誤 「google.ac」爲空或不是對象 線402 焦炭1PHP PRODOM解析錯誤

我想什麼,第402行包含標籤和很多「;」, 我該如何解決這個問題?

<?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); 
       } 
?> 
+0

'$ dom-> loadHTML('$ data1');'肯定是錯誤的。 – chx 2012-01-15 14:45:27

+0

那我該怎麼辦呢?我該怎麼辦?我的基本目標是從代碼中獲取內容,並可能保存它。 – 2012-01-15 14:51:46

+0

對不起,我已經得到了您的要點chx,它的$數據。當我嘗試這個時,我試圖使用get_matche()來提取只需要的標籤,但是當粘貼代碼在這裏時,我忘了更改變量..現在更新,謝謝親愛的 – 2012-01-15 17:55:29

回答

1

沒有與代碼的幾個問題:

  1. 您應該添加捲曲選項 - CURLOPT_RETURNTRANSFER - 爲了捕獲輸出。默認情況下,輸出顯示在瀏覽器上。像這樣:curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);。在上面的代碼,$data永遠是TRUE或FALSE(http://www.php.net/manual/en/function.curl-exec.php

  2. $dom->loadHTML('$data');是不正確的,不需要

  3. 「A」的標籤可能是不正確的閱讀「禮」的方法,並且因爲$ list-> item(30)將始終指向第30個元素

總之,即將到來的修復。我不確定你是否檢查了CURL請求返回的HTML,但它看起來與我們在original post中討論的不同。換句話說,CURL返回的HTML不包含所需的<ul><li>元素。它代之以包含<td><a>元素。

附加組件我不是很確定爲什麼當瀏覽器和從PHP讀取時,爲同一頁的HTML不同。但這是我認爲可能適合的理由。該頁面使用JavaScript代碼在頁面加載時動態呈現一些HTML代碼。從瀏覽器查看時,可以看到這種動態HTML,但不能從PHP查看。因此,我假設<ul><li>標籤是動態生成的。無論如何,這不是我們現在關注的問題。

因此,你應該修改你的代碼來解析<a>元素,然後讀取圖像的URL。此代碼片段可能有所幫助:

<?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>'; 
     } 
    } 
} 

我希望以上是有道理的。但請注意,如果Google修改其HTML,則上述解析可能會失敗。

+0

再次感謝abhay幫助我......你看起來是一個幫助別人的好人,上帝保佑你......我試着你的代碼,並會確認你的結果。再次感謝兄弟.. – 2012-01-16 14:13:18

+0

中提琴...它的作品...感謝你的朋友...感謝您的幫助,如果我可以投你,我會做很多解決方案,幫助和指導,再次感謝 – 2012-01-16 14:17:47

+0

很棒@NewBee,很高興知道它對你有用。並感謝您的反饋:-) – Abhay 2012-01-16 15:23:23