PerlでHTML5を良い感じにパーズするHTML::HTML5::Parserの使い方
Perlでスクレイピングをする時にはHTML::HTML5::Parser
というモジュールが便利なので紹介する。
Perlのhtml parseライブラリは多くあるが、どれもHTML5はできないみたいなものが多いが、
HTML::HTML5::Parser
であれば、十分に役割を果たしてくれる。
開発環境
- Perl 5.40.2
- cpm 0.997018
Perlのバージョンは5系であれば何でもOKだと思う。
また、パッケージマネージャはcpmを使う。(これもcpanmとかcpanでも何でも良い)
環境功徳
以下のモジュールをインストールすること。
cpm install HTML::HTML5::Parser XML::LibXML::QuerySelector
モジュール名の通り、今回はquerySelectorでhtml5をパーズできるようにする。
使い方
使い方は簡単。説明するよりもサンプルコードを見たほうがわかりやすい。
use v5.40;
use HTML::HTML5::Parser;
use XML::LibXML::QuerySelector;
use Encode;
use utf8;
# オブジェクトの初期化
my $parser = HTML::HTML5::Parser->new;
# parseしたいhtml の文字列
my $html = "<html><head>...";
# documentオブジェクトを作成
my $document = $self->html_parser->parse_string(
Encode::decode('utf8', $response->{content}),
{ encoding => 'utf-8' }
);
my $h1 = $document->querySelector('h1#title');
# getAttribute() 指定した属性を取得
my $h1_class = $h1->getAttribute('class');
# textContent テキストを取得する
my $h1_text = $h1->textContent;
# toString htmlを文字列で取得する
my $h1_html = $h1->toString;
say "h1 class名: $h1_class";
say "h1 text: $h1_text";
say "h1 html: $h1_html";
そして、複数のdomを取得したい場合は、querySelectorAll
を使えば良い。
my @ul_list = $document->querySelectorAll("ul.wrap li.item");
for (@ul_list) {
my $text = $_->textContent;
say $text;
}
参考文献
ライブラリの公式ドキュメント配下の通り。