2013-06-18 66 views
1

我正在研究需要刮取用戶提交的網站一部分的應用程序。我想從網站收集有用和可讀的內容,絕對不是整個網站。如果我查看也是這樣的應用程序(例如thinkery),我注意到它們以某種方式設法創建了一個颳去網站的方法,嘗試猜測有用的內容是什麼,以可讀的格式顯示它,並且它們執行的速度非常快。從網站中提取有用/可讀的內容

我一直在玩cURL,我越來越接近我想要的結果,但我有一些問題,並想知道如果有人有一些更多的見解。

$ch = curl_init('http://www.example.org'); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    // $content contains the whole website 
    $content = curl_exec($ch); 

    curl_close($ch); 

通過非常簡單的代碼上面,我可以湊了整個網站,用的preg_match()我可以嘗試找到DIV與包含字符串「內容」,「摘要」等等類別,ID或屬性的。

如果preg_match()有結果,我可以相當猜測我找到了相關內容並將其另存爲保存頁面的摘要。我遇到的問題是cURL將整個頁面保存在內存中,因此這可能佔用大量時間和資源。我認爲在這麼大的結果上做preg_match()也會花費很多時間。

有沒有更好的方法來實現這一目標?

+1

'preg_match'從包含整個HTML頁面的字符串中查找內容?你在開玩笑吧?如果你很擔心內存,'allow_url_fopen'並直接使用'DomDocument :: loadHTMLFile'加載頁面 –

+0

這可能是爲什麼我在尋找幫助,我知道它會打破標籤沒有正確關閉,它是其中一個較慢的功能。 //謝謝,會嘗試一下。 – erik404

回答

1

我試過的DomDocument :: loadHTMLFile作爲一招的小馬建議(感謝!)

$ch = curl_init('http://stackoverflow.com/questions/17180043/extracting-useful-readable-content-from-a-website'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $content = curl_exec($ch); 
    curl_close($ch); 
    $doc = new DOMDocument(); 
    @$doc->loadHTML($content); 

    $div_elements = $doc->getElementsByTagName('div'); 

    if ($div_elements->length <> 0) 
    { 
     foreach ($div_elements as $div_element) 
     { 
      if ($div_element->getAttribute('itemprop') == 'description') 
      { 
       var_dump($div_element->nodeValue); 

      } 
     } 
    } 

上面的代碼,結果是我的問題在這裏在此頁!剩下的事情就是找到一個循環或查詢div的好方法,並確定它是否有用。

+1

這很好,但我認爲你應該使用'textContent'屬性。和'libxml_use_internal_errors(true)'來抑制錯誤。還要查看[xpath](http://php.net/manual/en/class.domxpath.php),只想查詢文本節點 - '// div/text()[normalize-space()] ' –