2012年10月4日 星期四

PHP抓取網頁內容解析(PHP Simple HTML DOM Parser)

抓取網頁內容,要取得想要的資料,常要解析HTML,
如果已經會使用 jQuery 可以考慮使用 PHP Simple HTML DOM Parser 來解析。
官方網站:http://simplehtmldom.sourceforge.net/

官網有很詳盡的使用說明:http://simplehtmldom.sourceforge.net/manual.htm

使用上很簡單
先到 http://sourceforge.net/project/showfiles.php?group_id=218559 下載檔案。
解壓縮後,只須要裡面 simple_html_dom.php 這個檔。

使用時,要先取得 DOM物件。
取得 DOM物件的方式有三種:
  1. 給HTML解析
    $html = str_get_html('<html><body>Hello!</body></html>');
  2. 給網址解析
    $html = file_get_html('http://example.com/');
  3. 給一個網頁檔
    $html = file_get_html('test.htm');
取得 DOM物件後,便可以用jQuery的選擇器語法,來取得想要的內容。
假設欲解析的HTML內容如下:
<div id="list">
<ul>
<li>xx1</li> 
<li>xx2</li> 
</ul>
<ul>
<li>yy1</li> 
<li>yy2</li> 
</ul>
</div>
解析範例:
require_once('simple_html_dom.php');
$html = file_get_html('http://example.com');
$res=$html->find("#list ul");//抓取<div id="list">底下所有的<ul>
foreach($res as $k=>$a){
  $b = $a->find("li");
  $v1 = $b[0]->plaintext;//第一次迴圈:xx1,第二次迴圈:yy1
  $v2 = $b[1]->plaintext;//第一次迴圈:xx2,第二次迴圈:yy2
}

備註:
  • 若需要使用 POST 的方式取得資料,看 simple_html_dom.php 裡面 file_get_html() 的寫法,發現此函式使用 call_user_func_array(),把接收的參數傳給 file_get_contents() 取得網頁資料。所以可以參考
    http://php.net/manual/en/function.file-get-contents.php 的用法,以 POST 方式取得資料。
    範例如下:
    $data=array('p1' => 'aa', 'p1' => 'bb');//POST 的資料
    $data_url = http_build_query($data);
    $data_len = strlen ($data_url);
        
    $request = array(
        'http' => array (
            'method' => 'POST',
            'content' => $data_url,
            'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
            "Content-Length: " . $data_len . "\r\n" 
        ) 
    );
    $context = stream_context_create($request);
    $html = file_get_html('http://example.com', false, $context);
    
  • 類似 POST 取得資料的使用方式,官網說明提供一個使用 proxy 的使用範例。
    http://simplehtmldom.sourceforge.net/manual_faq.htm#proxy

沒有留言:

張貼留言