Perlで壊れたHTMLを補完する
HTML::TreeBuilderのas_HTML()がうまいことやってくれます。
(実際にはHTML::Element::as_HTML()ですが)
sub _complement_html {
my $broken_html = shift;
my $html = do {
no strict 'refs';
no warnings 'redefine';
local *HTML::Entities::encode_entities = sub {};
local *HTML::Entities::decode = sub {};
my $tree = HTML::TreeBuilder->new;
$tree->parse( $broken_html );
$tree->as_HTML;
};
$html =~ s#<html><head></head><body>##g;
$html =~ s#</body></html>##g;
$html =~ s#<div>(?:\ )?</div>##ig;
return $html;
}
この関数を使って<div align="right">foo<font color="#000000">black textのような閉じてないタグをもったHTMLを渡すと
<div align="right">foo<font color="#000000">black text</font></div>こんな感じに補完してくれます。
もっと良い方法あるんですかね。
あったら教えて欲しいっす。