Introduction

ブログ内検索

  • このサイトの記事を検索 by Google

おすすめの一冊!

無料ブログはココログ

« Perl 本 | トップページ | セッション鍵の生成 »

2010-10-13

XHTML を取り込みたい


とある wiki の表のデータを取り込む Perl スクリプトを書いたので、メモ。


解析対象の wiki は XHTML で書かれているのですが、

    1. 文字コードが EUC-JP
    2. XHTML(というか XML)の文法に違反している記述がある

というハードルがありました。




前者についてはちゃんとソース中で文字コードが指定されているので
本来なら問題ないハズですが、XML 解析ライブラリが意味不明のエラーを
吐くので対応してみました。

コードは以下の通り↓

my $html = sub { use Encoding 'euc-jp'; use LWP::Simple; my $src = get($url); my $str = Encode::encode('utf-8', $src); $str =~ s/euc-jp/utf-8/ig; return $str; }->();
文字コード指定の書き換えがちょっと hacky ですが、とりあえず動きます。 この文字列 ($html) の一部を print するとちゃんと UTF-8 になってます。 2個目のハードルについては、XML::Liberal を使わせていただきました。 このライブラリは XML::LibXML のパーサの代わりに使えるもので、 well-formed XML じゃない不正な XML でも食べてくれるパーサです。 基本的にはよろしくやってくれるのですが、一部のリンクに含まれていた 「&」文字を実体参照としてパースしようとしてエラーになってしまったので、 正規表現で対応しました(ちょっと無理矢理)。
$html =~ s/&adptg_mid=/&adptg_mid=/g; $html =~ s/&adptg_lid=/&adptg_lid=/g; my $dom = sub { use XML::Liberal; my $parser = XML::Liberal->new('LibXML'); return $parser->load_xml({string => $html}); }->();
あと、XHTML の解析には XPath を使ってみました。
my @tdList = sub { my $xpc = XML::LibXML::XPathContext->new($dom); $xpc->registerNs('x', 'http://www.w3.org/1999/xhtml'); return $xpc->findnodes("//x:div[\@id='hoge']/x:table[position()=1]/x:tbody/x:tr/x:td"); }->();
とっても便利♪ ちなみに、XPath で取得したリストの要素は DOM Element なので、いろいろできます。
my %table; foreach my $tdElem (@tdList) { my $url = $tdElem->firstChild()->getAttribute('href'); my $name = $tdElem->firstChild()->textContent(); $table{$name} = $url; }
まぁ、JavaScript で DOM 操作に慣れていれば直感で書けます。カンタン! この Perl スクリプトを使ったサービスは現在構想中。 いま流行の「クラウド」をユーザスクリプト (GreaseMonkey) と組み合わせた なかなか面白いサービスになる予定です(妄想

« Perl 本 | トップページ | セッション鍵の生成 »