1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="keywords" content="php,tidy,スクレイピング,API,Webサービス" />
    <meta name="description" content="phpによるスクレイピング処理入門" />
    <title>phpによるスクレイピング処理入門:はてなブックマークの情報を取得</title>
    <link href="style.css" rel="stylesheet" type="text/css">
    </head>
    <?php
    define(INIT_URL , "http://b.hatena.ne.jp/");
    // proxyを利用する場合は 1 / 利用しない場合は0
    $use_proxy = 0;
    $proxy_host = 'proxy.example.com';
    $proxy_port = 8080;
    $no_proxy = array(
        'localhost',        // localhost 
        '127.0.0.0/8',      // loopback
    );
    include('proxy.php');
    
    function get_html($url){
        $rdata = http_request($url);
        $data = mb_convert_encoding($rdata['data'],"utf-8","auto");
        return ($data);
    }
    
    function dump_nodes_title(tidyNode $node, &$urls = NULL) {
        $urls = (is_array($urls)) ? $urls : array();
        if(isset($node->id)) {
        // ここからが実際のスクレイピング処理と思ってよいでしょう。
            // $node->id が Aタグだったら
            if($node->id == TIDY_TAG_A) {
                // $node->id に class属性がセットされていれば
                if (isset($node->attribute['class'])){
                    // $node->id の class属性値がbookmarkだったら
                    if (stristr ($node->attribute['class'] ,"bookmark") !==FALSE){
                        // <a href="http://ryouchi.seesaa.net/">りょーち</a>
                        // の場合、「りょーち」の文字を取得するには、
                        // $node->child[0]->value
                        // http://ryouchi.seesaa.net/ の文字を取得するには、
                        // $node->attribute['href']
                        // $urls にtitle,linkの連想配列として、タイトルとリンクを格納
                        $urls[] = array("title" => $node->child[0]->value ,"link" =>$node->attribute['href']);
                    }
                }
            }
        // ここまでが実際のスクレイピング処理と思ってよいでしょう。
        }
        // 更に子供のノードが存在すれば、再帰的にdump_nodes_title()を繰り返す
        if($node->hasChildren()) {
            foreach($node->child as $c) {
                dump_nodes_title($c, $urls);
            }
        }
        // 連想配列をリターン
        return $urls;
    }
    echo '<a href="'.INIT_URL.'">'.INIT_URL.'</a><br />';
    // INIT_URLで指定されたHTMLファイルを取得して$dataに格納
    $data = get_html(INIT_URL);
    // Tidy関数で整形する際のおまじない。
    $config = array('indent' => TRUE,
                    'output-xhtml' => TRUE,
                    'wrap' => 200);
    // 取得したHTMLファイルの内容をUTF-8の文字コードで$configで
    // 指定した設定で、tidyオブジェクトを作成
    $tidy = tidy_parse_string($data, $config, 'UTF8');
    // cleanRepairで整形
    $tidy->cleanRepair();
    // 作成したtidyオブジェクトのbody要素の内容をdump_nodes_title()に渡す
    // $urlsにはtitle,linkのペアの配列が格納されている。
    $urls = dump_nodes_title($tidy->body());
    echo '<div align="left"><ul>';
    // 取得されたurlsをforeachで回す
    foreach ($urls as $item){
        // $item['link'] / $item['title'] を出力
        echo '<li><a href="'.$item['link'].'" target="_blank">'.$item['title'].'</a>';
    }
    echo '</ul></div>';
    ?>
    </body>
    </html>