2008-03-20
■[TECH][Perl] はじめてのHTML::Parser
HTMLをパースしてくれるHTML::Parser。検索結果で出てくるマニュアルはいまいち分かりづらかったので、自分なりの試行錯誤メモを残しておく。
HTMLを読み込んで、特定タグの要素を抜き出す。
a タグと img タグだけの簡単なHTMLを用意して、それぞれに指定されたhref属性とsrc属性を抜き出してみる。
<html> <head> <title>TEST</title> </head> <body> <a href="http://kirinji.amayan.jp/"><img src="http://kirinji.amayan.jp/kirinji_top.gif"></a> </body> </html>
で、これをHTML::Parserで解析してみる。
#!/usr/bin/perl use strict; use warnings; use HTML::Parser; ## サンプルHTML my $html =<< "END_OF_HTML"; <html> <head> <title>TEST</title> </head> <body> <a href="http://kirinji.amayan.jp/"><img src="http://kirinji.amayan.jp/kirinji_top.gif"></a> </body> </html> END_OF_HTML ## HTML::Parser呼び出し my $parser = HTML::Parser->new( api_version => 3, ## 開始タグ(<a href="..>")を読み込んだときに毎回発生するイベント ## 左から、 ## 「イベント発生時に呼び出すメソッドへのリファレンス」 ## 「メソッドに渡す引数の種類選択」 ## - selfは自分自身のクラス ## - tagnameはタグ名前(a とか img とか。小文字変換されている) ## - attrはタグ内要素のハッシュリファレンス(要素名 => 値 で入ってる) ## - textはタグで囲まれたテキスト start_h => [\&read_tags, "self, tagname, attr, text"], marked_sections => 1, ); $parser->parse($html); ## イベント発生時のメソッドを定義 sub read_tags { my ($self, $tagname, $attr, $text) = @_; ## 上で選んだ引数が渡ってくる my $href = $attr->{href} if ($tagname eq 'a'); my $src = $attr->{src} if ($tagname eq 'img'); print "href = $href" . "\n" . "imgsrc = $src" . "\n"; }
こんな感じのスクリプトを走らせると、こんな結果になります。
href = http://kirinji.amayan.jp/ imgsrc = http://kirinji.amayan.jp/kirinji_top.gif
トラックバック - http://d.hatena.ne.jp/amayan/20080320/1205973108
リンク元
- 180 http://search.msn.co.jp/results.aspx?q=エド・はるみ&FORM=MSNH&cp=65001
- 156 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=zYz&q=エド・はるみ&btnG=検索&lr=lang_ja
- 125 http://www.google.co.jp/search?q=perl+html+パース&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 95 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=9ec&pwst=1&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=html+parser+perl&spell=1
- 77 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBF_jaJP229JP230&q=エドはるみ
- 71 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/amayan/20080320/1205973108
- 71 http://www.google.co.jp/search?hl=ja&q=perl+html+パース&btnG=検索&lr=
- 60 http://b.hatena.ne.jp/entry/7946510/Perl html パーサー はじめてのHTML::Parser - ナナクサ
- 53 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cts=1331050970841&ved=0CC4QFjAA&url=http://d.hatena.ne.jp/amayan/20080320/1205973108&ei=0DlWT5PYJ--RiQfqoeXKCA&usg=AFQjCNFpFhOI8823GBw4pQvegjiEpQ3GmQ&sig2=yEg2QS1pSZPbt_lAE2dFGw
- 48 http://www.google.co.jp/search?q=perl+HTML::Parser&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a


