しゃのんあどべんとかれんだー 19 日目 (Perl 5 で HTML5 パースしましょ) 匿名 匿名 この記事は、しゃのんあどべんとかれんだー 19 日目の記事です。 ![Perl5](http://4.bp.blogspot.com/-cjxXv3CEXuk/VopzejZL81I/AAAAAAAAAWQ/DcF-vzyyjO4/s200/perl.png) どうも、munepom (`@__munepom__`) です。 今回は、Perl 5 の HTML パーサに関するおはなし その 2 です。 # HTML5 もパースしたいです。 そんなとき、ありますよね。 HTML を解析して、どこかに別のタグを埋め込みたいこと、ありますよね。 トラッキングタグなどやビーコンの類などを、動的に埋め込んだりする際に重宝します。 # 今回は、HTML5 もパースできるパーサのご紹介です。 HTML::TagParser や HTML::HTML5::Parser を使うと、HTML5 のタグ指定方法でも情報を参照できます。 ``` #!/usr/bin/env perl use strict; use warnings; use utf8; use LWP::UserAgent; use Encode; use HTML::TagParser; use HTML::HTML5::Parser; use XML::LibXML::QuerySelector; use feature qw/say/; use experimental 'signatures'; ### fields my $url = 'http://shanon.co.jp/'; ### main my $body = get_document($url); process_with_tagparser($body); process_with_html5($body); ### sub sub get_document ($url) { my $ua = LWP::UserAgent->new; $ua->agent('Shanon'); my $res = $ua->get($url); my $body = $res->decoded_content; } # HTML::TagParser 処理 sub process_with_tagparser ($body) { # parse my $doc_tagparser = HTML::TagParser->new( encode('utf-8', $body) ); my @list_tagparser = $doc_tagparser->getElementsByTagName('footer'); # print foreach (@list_tagparser) { say $_->innerText(); } } # HTML::HTML5::Parser 処理 sub process_with_html5 ($body) { # parse my $parser = HTML::HTML5::Parser->new; my $document = $parser->parse_string( encode('utf-8', $body), { encoding => 'utf-8' } ); # javascript like に書けます my @list = $document->querySelectorAll('footer'); # print foreach (@list) { say encode_utf8($_->textContent); say encode_utf8($_->getAttribute('href')); } } ``` HTML::HTML5::Parser と XML::LibXML::QuerySelector の組み合わせですと、JavaScript でよく使う関数名が定義されていますので、より直感的に情報を取得できるかと思います。 (XML::LibXML compatible なメソッドが使えると、cpan サイトには書かれていますね。) #### 2 モジュールのちょっとした違いについて HTML::TagParser では、"&" や "©" などの文字は、HTML の数値エンティティ参照に変換されていました。(& = & © = ©) HTML::HTML5::Parser では、上記文字は実際の文字で表示されました。 利用する際は、違いを意識すると良いのかもしれませんね。 HTML5 もゴリゴリ解析して、レッツ Enjoy! (・ω・)ノ Tweet Share Share Share Share