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; }

参考文献

ライブラリの公式ドキュメント配下の通り。