HTML分解クラス、htmlPurserと付属の、HTMLを切り出して、任意の箇所を取得する、scrapeの使用サンプルです。
scrapeは、htmlPurserのサンプルのつもりで作ったのですが、意外と使用用途ありそうだったので、パッケージに入れました。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
<?php
// +----------------------------------------------------------------------+
// |                            html Parser                               |
// +----------------------------------------------------------------------+
// | PHP Version 4.5                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2007 The Artisan Member                           |
// +----------------------------------------------------------------------+
// | Authors: Akito<akito-artisan@five-foxes.com>                         |
// +----------------------------------------------------------------------+
//
/**
 * Google検索して、検索結果を切り出しています。
 *
 * 本来こう言う事やりたい時は、SOAPサービスとか使用するんでしょうが、テストと言うことで・・・
 * html Parserの使い方のサンプルと言うより、scrapeのサンプルですね。
 * html Parserの使い方のサンプルは、scrapeになる感じで。
 * 今回は、Googleの検索結果と言うことで、ちょっとややこしくなってしまっていますが、
 * ブログ等、idやclassでしっかり分けられた、HTMLを分解するなら、もっと楽に書けそうです。
 *
 * googleには他にも、辞書機能や、乗り換え機能など色々ありますが、
 * 今回は、「google電卓」と、「もしかして」のみとなっております。。
 *
 */

// ライブラリを読む
require_once("./hp/scrape.php");

// URL精製用にファイル名を取得する
$this_fname basename(__FILE__);

/**
 * googleさんが精製したUTF8のURLをEUC-JPにする
 *
 * @param string $url 変換したいURL
 * @return string 
 */
function replace_url($url)
{
    global 
$this_fname;
    if (
ereg("^/search"$url)) {
        
$parse_url parse_url($url);
        if (isset(
$parse_url["query"])) {
            
parse_str($parse_url["query"], $parse_url["query"]);
            if (isset(
$parse_url["query"]["ie"]) ? $parse_url["query"]["ie"] == "UTF-8" false) {
                
$parse_url["query"]["ie"] = "EUC-JP";
                
$parse_url["query"]["q"]  = mb_convert_encoding($parse_url["query"]["q"], "EUC-JP""UTF-8");
            }
            
            
$url "";
            
reset($parse_url["query"]);
            
$gc each($parse_url["query"]);
            
$gc[1] = urlencode($gc[1]);
            
$url "{$parse_url['path']}?{$gc[0]}={$gc[1]}";
            while (
$gc each($parse_url["query"])) {
                
$gc[1] = urlencode($gc[1]);
                
$url .= "&{$gc[0]}={$gc[1]}";
            }
            
        }
        return 
ereg_replace("^/search"$this_fname$url);
    } else {
        return 
$url;
    }
}

/**
 * GET優先で、フォーム値を取得する
 *
 * @param string $var_name name属性
 * @param mixed $no_var 値が来ない場合に返す値(OPTIONAL)
 * @return string
 */
function form_var($var_name$no_var FALSE)
{
    if (isset(
$_GET[$var_name])) {
        
$res $_GET[$var_name];
    } elseif(isset(
$_POST[$var_name])) {
        
$res $_POST[$var_name];
    } else {
        
$res $no_var;
    }
    return 
$res;
}

/**
 * 文字入力フォームを出力する
 *
 * @param string $name name属性
 * @param string $value value属性 (OPTIONAL)
 * @param string $attribute その他属性 (OPTIONAL)
 * @return string
 */
function form_text($name$value false$attribute "")
{
    
$text '<input type="text" name="'.htmlspecialchars($name).'"';
    if (!
$value) {
        
$value form_var($name);
    }
    if (
$value) {
        
$text .= ' value="'.htmlspecialchars($value).'"';
    }
    
$text .= " ".$attribute.">";
    return 
$text;
}

//検索のタイプを決定(拡張用:未使用)
$type form_var("type""flowers");

//内容
$text form_var("text");
if (
$text == false) {
    
$text form_var("q");
}

// 文字数制限
if ($text != false) {
    
$text trim(mb_substr($text0255));
}

$lr  form_var("lr""");
$str form_var("start"0);

if(!
ereg('[0-9]'$str)){
    
$str 0;
}

?>
<html>
<head>
<title>てきとう検索
<?php
if ($text) {
    echo 
" - ".$text;
}
?>

</title>
</head>
<style><!--
.a,.a:link{color:green}
--></style>
<body>
<H2>てきとう検索</H2>
<form action="./tsearch.php">
<a href="./tsearch.php">←</a><?php echo form_text("text",$text,$attribute='size="40" maxlength="255"'); ?><input type="submit" value="検索">
<BR>
<input type="hidden" name="type" value="flowers">
<input type="radio" name="lr" value="" <? if($lr!="lang_ja"){ ?>checked<? ?> id="allh"><label for="allh">すべてのwebページから</label>
<input type="radio" name="lr" value="lang_ja" <? if($lr=="lang_ja"){ ?>checked<? ?> id="jah"><label for="jah">日本語ページのみ</label>
<input type="hidden" name="_flow" value="◇◆もじばけぼうし◇◆">
</form>
<?php

if ($text) {
    
// google検索処理
    
$t array_sum(explode(" "microtime()));
    
// google問い合わせクエリを作成
    
$url_text urlencode($text);
    
$url    'http://www.google.co.jp/search?hl=ja&inlang=ja&ie=EUC-JP&oe=EUC-JP&lr='.$lr.'&q='.$url_text.'&start='.$str;
    
$google = @file_get_contents($url);
    if (!
$google) {
?>
<font color="red">Googleへの問い合わせに失敗しました。<br />処理を中断新ます</font>
</body>
</html>
<?php
        
die();
    }
    
    
// 文字コード変更
    
$google mb_convert_encoding($google"EUC-JP""auto");
    
    
// 取得文字数取得
    
$contents_lenb mb_strwidth($google);
    
    
// 分解クラス精製
    
$scrape =& new scrape();
    
    
// 検索結果の取得
    
$scrape->setProcess("a"HP_SCRAPE_OPTIONS
        array(
"class" => "l"), 
        
HP_SCRAPE_WHEREMODE_TEXT
        array(
"url" => "href")
    );
    
$scrape->setProcess("a"HP_SCRAPE_CONTENTS_TEXT, array("class" => "l"));
    
    
// 関連検索
    
$scrape->setProcess("a"HP_SCRAPE_OPTIONS
        array(
            
"href" => "^/search.*suggest.*$"
        
), 
        
HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );
    
$scrape->setProcess("a"HP_SCRAPE_CONTENTS_TEXT
        array(
            
"href" => "^/search.*suggest.*$"
        
), 
        
HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );

    
// 次へのリンク
    
$scrape->setProcess("a"HP_SCRAPE_OPTIONS
        array(
            
"href"  => "^/search.*start=[0-9]{1,4}&sa=N$"
            
"class" => false
            
"id"    => false
        
), HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );
    
$scrape->setProcess("a"HP_SCRAPE_CONTENTS_ALL
        array(
            
"href"  => "^/search.*start=[0-9]{1,4}&sa=N$"
            
"class" => false
            
"id"    => false
        
), HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );
    
$scrape->setProcess("a"HP_SCRAPE_CONTENTS_TEXT
        array(
            
"href"  => "^/search.*start=[0-9]{1,4}&sa=N$"
            
"class" => false
            
"id"    => false
        
), HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );

    
// もしかして
    
$scrape->setProcess("a"HP_SCRAPE_OPTIONS
        array(
            
"href"  => "^/search.*spell=.*$"
            
"class" => "^p$"
        
), 
        
HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );
    
    
$scrape->setProcess("a"HP_SCRAPE_CONTENTS_TEXT
        array(
            
"href"  => "^/search.*spell=.*$"
            
"class" => "^p$"
        
), 
        
HP_SCRAPE_WHEREMODE_EREG
        array(
"url" => "href")
    );

    
$scrape->setProcess("td"
        
HP_SCRAPE_CONTENTS_ALL,
        array(
"class" => "j")
    );
    
    
// 検索件数
    
$scrape->setProcess("table"HP_SCRAPE_CONTENTS_TEXT
        array(
            
"border"      => "0"
            
"cellpadding" => "0"
            
"cellspacing" => "0"
            
"width"       => "100%"
            
"bgcolor"     => "#e5ecf9"
        
)
    );
    
    
// google電卓
    
$scrape->setProcess("img"HP_SCRAPE_OPTIONS,
        array(
"src" => "/images/calc_img.gif"), 
        
HP_SCRAPE_WHEREMODE_TEXT,
        array(
"src" => "src")
    );
    
    
// 処理
    
$res $scrape->go($google);
    
$search_result $scrape->getContentsArray();
    
    
    
// google電卓
    
$calc "";
    if (isset(
$search_result["img"])) {
        
$search_all_result $scrape->getAllContentsArray();
        foreach (
$search_all_result[0] as $key => $value) {
            if (
$value["tagname"] == "img" && $value["option"][0]["value"] == "/images/calc_img.gif") {
                
$calc $search_all_result[1][$key+7];
                break;
            }
        }
        
    }
    
    
// メモリ開放
    
$scrape->free();
    
// 総実行時間
    
$search_time array_sum(explode(" "microtime())) - $t;
    
    
// 検索結果表示
?>
<!--Googleの検索結果↓-->
<?php echo $search_result["table"][0][0]; ?><br />
<br />
<?php
    
if (strlen($calc)) {
        echo 
"<b>{$calc}</b><br /><br />";
    }
    if (isset(
$search_result["a"][7]) ? count($search_result["a"][7]) && count($search_result["a"][7]) == count($search_result["a"][8]) : false) {
?>もしかして:
        <a href="<?php echo replace_url($search_result["a"][7][0]["url"]); ?>"><?php echo $search_result["a"][8][0]; ?></a><br />
<br />
<?php
    
}
    if (isset(
$search_result["a"][0]) ? count($search_result["a"][0]) && count($search_result["a"][0]) == count($search_result["a"][1]) : false) {
        
        
$hp =& new htmlParser();
        foreach (
$search_result["a"][0] as $a => $b) {
?>
<a href="<?php echo $b["url"]; ?>"><?php echo $search_result["a"][1][$a]; ?></a><br />
<?php
            $contents_array 
= isset($search_result["td"][0][$a]) ? $hp->parse($search_result["td"][0][$a]) : $hp->parse("");
            foreach (
$contents_array[0] as $key => $item) {
                if (
$item["tagname"] == "a") {
                    foreach (
$item["option"] as $siri => $value) {
                        if (
$value["name"] == "href") {
                            
$contents_array[0][$key]["option"][$siri]["value"] = replace_url($contents_array[0][$key]["option"][$siri]["value"]);
                        }
                    }
                }
            }
            echo 
$hp->unParse($contents_array);
?>
<br />
<br />
<?php
        
}
    }
    if (isset(
$search_result["a"][2]) ? count($search_result["a"][2]) && count($search_result["a"][2]) == count($search_result["a"][3]) : false) {
?>
        関連検索: 
<?php
        
foreach ($search_result["a"][2] as $key => $value) {
?>
            <a href="<?php echo replace_url($value["url"]); ?>"><?php echo $search_result["a"][3][$key] ; ?></a>
<?php
        
}
?>
<br />
<?php
    
}
    if (isset(
$search_result["a"][7]) ? count($search_result["a"][7]) && count($search_result["a"][7]) == count($search_result["a"][8]) : false) {
?>もしかして:
        <a href="<?php echo replace_url($search_result["a"][7][0]["url"]); ?>"><?php echo $search_result["a"][8][0]; ?></a><br />
<br />
<?php
    
}
    
// ページ送り
    
if (isset($search_result["a"][4]) ? count($search_result["a"][4]) && count($search_result["a"][4]) == count($search_result["a"][5]) : false) {
?>
        <br /><br />
        <center>
        <table align="center"><tr>
<?php
        $is_flag 
true;
        foreach (
$search_result["a"][4] as $key => $value) {
            
// 前へリンクが無い時は、1
            
if ($key == && is_numeric(trim($search_result["a"][6][$key]))) {
                
$is_flag false;
?>
                <td align="center">●<br />1</td>
<?php
            
}
            
// リンクの挿入
?><td align="center">
<?php
            
if ($key == && !is_numeric(trim($search_result["a"][6][$key]))) {
                echo 
"←";
            } elseif (!
is_numeric(trim($search_result["a"][6][$key]))) {
                echo 
"→";
            } else {
                echo 
"○";
            }
            
?>
            <br />
            <a href="<?php echo replace_url($value["url"]); ?>"><?php echo $search_result["a"][6][$key] ; ?></a>
</td>
<?php
            
if ($key && is_numeric(trim($search_result["a"][6][$key])) && 
                (isset(
$search_result["a"][6][$key+1]) ? is_numeric(trim($search_result["a"][6][$key 1])) : false)) {
                if ((
trim($search_result["a"][6][$key])+1) != trim($search_result["a"][6][$key+1])) {
                    
// 次のリンクとの、差文が1以上なら、間にcurrentが入る
                    
$is_flag false;
?>
                <td align="center">●<br /><?php echo(trim($search_result["a"][6][$key])+1);?></td>
<?php
                
}
                
            }
            
        }
        if (
$is_flag) {
            
// 一回もcurrentが無い場合は、一番最後につける
?>
            <td align="center">●<br /><?php echo(trim($search_result["a"][6][$key])+1);?></td>
<?php
        
}
?>
        </tr></table></center>
<?php
    
}

?>
<center>
<form action="./tsearch.php">
<a href="./tsearch.php">←</a><?php echo form_text("text",$text,$attribute='size="40" maxlength="255"'); ?><input type="submit" value="検索">
<BR>
<input type="hidden" name="type" value="flowers">
<input type="radio" name="lr" value="" <? if($lr!="lang_ja"){ ?>checked<? ?> id="allm"><label for="allm">すべてのwebページから</label>
<input type="radio" name="lr" value="lang_ja" <? if($lr=="lang_ja"){ ?>checked<? ?> id="jam"><label for="jam">日本語ページのみ</label>
<input type="hidden" name="_flow" value="◇◆もじばけぼうし◇◆">
</form>
</center>
<div align="right">
取得HTMLデータの総文字数:<?php echo $contents_lenb ;?><br />
検索総実行時間:<?php echo $search_time ;?><br />
</div>
<?php
}
?>

</body>
</html>