2013-11-27 42 views
0

我有一個簡單的任務。 從頁面中獲取所有文章,以及獲取每篇文章的所有圖片。PHP簡單的HTML DOM解析器:獲取所有文章

今天,我決定用PHP Simple HTML DOM Parse

舉個例子,我用下面的代碼:

<?php 

include("simple_html_dom.php"); 

$sitesToCheck = array(
    array(
     'url' => 'http://googleblog.blogspot.ru/', 
     'search_element' => 'h2.title a', 
     'get_element' => 'div.post-content' 
    ), 
    array(
     // 'url' => '',   // Site address with a list of of articles 
     // 'search_element' => '', // Link of Article on the site 
     // 'get_element' => ''  // desired content 
    ) 
); 

$s = microtime(true); 

foreach($sitesToCheck as $site) 
{ 
    $html = file_get_html($site['url']); 

    foreach($html->find($site['search_element']) as $link) 
    { 
     $content = ''; 
     $savePath = 'cachedPages/'.md5($site['url']).'/'; 
     $fileName = md5($link->href); 

     if (! file_exists($savePath.$fileName)) 
     { 
      $post_for_scan = file_get_html($link->href); 

      foreach($post_for_scan->find($site["get_element"]) as $element) 
      { 
       $content .= $element->plaintext . PHP_EOL; 
      } 

      if (! file_exists($savePath) && ! mkdir($savePath, 0, true)) 
      { 
       die('Unable to create directory ...'); 
      } 

      file_put_contents($savePath.$fileName, $content); 
     } 
    } 
} 

$e = microtime(true); 

echo $e-$s; 

我會盡量只得到文章沒有圖片。但是,我從服務器獲取

響應「120秒最長執行時間超過了」

請向我解釋,我做錯了什麼......

告訴我,有沒有其他的辦法讓所有的每個項目具體地址在文章的所有照片?

+1

這麼多的 「簡單」 的一部分,誒。 :)儘管如此,上次我檢查過它(幾個月前),simple_html_dom仍然是一堆熱氣騰騰的東西。 DOMDocument + DOMXPath佔用了空間和時間的1/5。從字面上看。通過消除它,我減少了80%的內存使用量和運行時間。 – cHao

+0

你不應該過分依賴這個,但是如果你事先知道一個過程需要很長時間,試試'set_time_limit(0)',但是在任何地方使用它都不是一個好習慣。如果超過最大執行時間(在你的情況下爲120秒),那麼這將阻止php殺死你的進程,並且它會一直運行直到它結束。問題是......如果你在程序中犯了一個錯誤,導致永遠運行,你的程序將在服務器上佔用資源,直到採取手動操作。 – ILikeTacos

+1

就這樣,我聽起來不像一個狂熱的仇敵,有一件事simple_html_dom可能會有好處。如果你的HTML損壞嚴重,不再看起來像HTML,那麼DOMDocument可能無法很好地處理它。像simple_html_dom *這樣的lib可能會更好地處理這種垃圾,因爲它的設計與古怪的標記一起工作。但是很少有必要解析一個非常糟糕的文檔,DOMDocument無法處理它。至少,我從來沒有處理過它。 – cHao

回答

1

我和那個庫有類似的問題。使用PHP的DOM文檔,而不是:

$doc = new DOMDocument; 
$doc->loadHTML($html); 
$links = $doc->getElementsByTagName('a'); 
foreach ($links as $link) { 
    doSomethingWith($link->getAttribute('href'), $link->nodeValue); 
} 

http://www.php.net/manual/en/domdocument.getelementsbytagname.php

+0

謝謝。現在有必要了解如何使用'div.post-content','table.wrapper td.content'或'div p a'等查詢來獲取項目。 – klay