perlでmicroformats

| 0 Comments | 0 TrackBacks | このエントリーをはてなブックマークに追加 このエントリーのはてなブックマーク件数

昨今、microformatsが熱いですね。

firefox/greasemonkey等クライアントサイドで盛り上がってますが、もちろんperlにもmicroformatsを扱えるモジュールがあります。

Text::Microformat : A Microformat parser 

テキストをパースしてmicroformatsを抽出します。現在サポートしているのは

  • hCal
  • hCard
  • hGrant(*)
  • rel-license
  • rel-tag

です。扱い方は

use strict;
use warnings;
use Text::Microformat;
use LWP::Simple;
use YAML::Syck;

my $doc = Text::Microformat->new( get('http://mattn.kaoriya.net/'));
my @formats = $doc->find;
foreach my $uf (@formats) {
	warn ref($uf)."\n";
	warn Dump $uf->ToHash;
}

といった感じですね。さて実行してみます。

Text::Microformat::Element::hCard
--- 
adr: 
  - 
    country-name: 
      - Japan
    locality: 
      - Osaka
email: 
  - mattn dot jp at gmail dot com
nickname: 
  - mattn
photo: 
  - http://mattn.kaoriya.net/images/logo.png
Text::Microformat::Element::rel_license
--- http://creativecommons.org/licenses/by-nc-sa/2.1/jp/

hCardとrel-licenseが出力されています。でも変ですね。確かにサイトにはrel-tagがあるのですが動いていないようです。調べたところ、rel属性には複数のリンクタイプが指定出来るのですが、これに対応出来ていないようです。

さらにソースを調べた所rel_tag.pmはText::Microformat::Elementを継承しており、Findプロシージャをオーバーライドして検索ロジックを書いてやればいい事が分かります。

sub Find {
    my $self = shift;
    my $tree = shift;

    my @rel = $tree->look_down(
        '_tag' => 'a',
        sub {
            my $rel = shift->attr('rel');
            return 1 if defined $rel and $rel =~ /\btag\b/;
        });
    return map(__PACKAGE__->new($_), @rel);
}

こんなコードをrel_tag.pmに付け足して再度実行します。

Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/coderepos
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/feed
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/pipes
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/yahoo
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/growl
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/perl
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/python
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/gae
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/google%20app%20engine
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/python
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/hatenaStar.js
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/vimperator
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/ajax
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/google
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/jquery
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/microformats
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/rel%2Dbookmark
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/web
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/google%20app%20engine
Text::Microformat::Element::rel_tag
--- http://mattn.kaoriya.net/tags/tips
Text::Microformat::Element::hCard
--- 
adr: 
  - 
    country-name: 
      - Japan
    locality: 
      - Osaka
email: 
  - mattn dot jp at gmail dot com
nickname: 
  - mattn
photo: 
  - http://mattn.kaoriya.net/images/logo.png
Text::Microformat::Element::rel_license
--- http://creativecommons.org/licenses/by-nc-sa/2.1/jp/

期待通りの結果が返ってきました。

Text::Microformatにはスキーマを構造で指定する物と、Findで見付ける物があり自由度は結構高いかと思います。さらにパーサとしてもHTML、XML、RSSをサポートしているので、大概のmicroformatsはパース出来るかと思います。

Elementもモジュール形式で定義出来るので新たなmicroformats draftにも簡単に対応出来る様ですね。

なお、Text::Microformatの開発は、以下のサイトで行われているようです。

ufperl - a Microformat parser for Perl

今のところhAtomやxFolkは無いようなので、どなたか作ってみてはどうでしょうか?

No TrackBacks

TrackBack URL: http://perl-mongers.org/MT/mt-tb.cgi/42

Leave a comment

About this Entry

This page contains a single entry by mattn published on June 2, 2008 1:19 PM.

perlクイズ - Scalar::Lazyの実装 was the previous entry in this blog.

固定電話の市外局番一覧ページを csv にするお役立ち hack! is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

Creative Commons License
This blog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en