サンプル・プログラム
解説:スクレイピング
0086: /**
0087: * スクレイピングの実行
0088: * @param int $windowウィンドウID
0089: * @return titleの内容
0090: */
0091: function execScraping($window) {
0092: $url = wb_get_text(wb_get_control($window, IDC_URL_EDIT));
0093: $html = @file_get_contents($url);
0094: if ($html == FALSE || $html == '') {
0095: put_error($window, ERROR_NOCONTENTS);
0096: return;
0097: }
0098:
0099: //parsing
0100: $parser = new HtmlParser(mb_convert_encoding($html, INTERNAL_ENCODING, 'auto'));
0101: $title = $description = '';
0102: $flag['title'] = $flag['description'] = FALSE;
0103: while ($parser->parse()) {
0104: //<title>
0105: if (!$flag['title'] && (preg_match('/title/i', (string)$parser->iNodeName) == 1)) {
0106: $parser->parse(); //読み進める
0107: $title = (string)$parser->iNodeValue;
0108: $flag['title'] = TRUE;
0109:
0110: //<meta name="description">
0111: } else if (!$flag['description'] && (preg_match('/meta/i', $parser->iNodeName) > 0)) {
0112: if ($parser->iNodeType == NODE_TYPE_ELEMENT) {
0113: $attrValues = $parser->iNodeAttributes;
0114: $attrNames = array_keys($attrValues);
0115: $size = count($attrNames);
0116: for ($i = 0; $i < $size; $i++) {
0117: $name = $attrNames[$i];
0118: if ((preg_match('/name/i', $name) > 0) && (preg_match('/description/i', $attrValues[$name]) > 0)) {
0119: $name = $attrNames[$i + 1];
0120: if ((preg_match('/content/i', $name) > 0)) {
0121: $description = (string)$attrValues[$name];
0122: }
0123: }
0124: }
0125: }
0126: }
0127: }
0128: //表示
0129: wb_set_text(wb_get_control($window, IDC_TITLE_EDIT), internal2sjis($title));
0130: wb_set_text(wb_get_control($window, IDC_DESCRIPTION_EDIT), internal2sjis($description));
0131: }
次に、これをクラスライブラリ「HTML Parser for PHP-4」に渡す。このとき、内部エンコードに変換しておくこと。
この時点でHTMLのパーシングは行われており、あとはwhileループを回して、1つ1つの要素をチェックしていく。
タグ名は iNodeName に、タグの実体は iNodeValue に格納されている。また、属性値は1つ1つ分解され iNodeAttributes に格納されている。
コンパイル
参考サイト
- PHPでDOMDocumentを使ってスクレイピング:ぱふぅ家のホームページ
- HTML Parser for PHP-4
残念ながら、DOMDocumentクラスはPHP5以上でないと利用できない。そこで、PHP4でも利用できるライブラリ「HTML Parser for PHP-4」を利用することにした。