Hatena::ブログ(Diary)

あまやん胸いっぱい このページをアンテナに追加 RSSフィード

2008-03-20

[][] はじめてのHTML::Parser

HTMLパースしてくれるHTML::Parser。検索結果で出てくるマニュアルはいまいち分かりづらかったので、自分なりの試行錯誤メモを残しておく。

HTMLを読み込んで、特定タグの要素を抜き出す。

a タグと img タグだけの簡単なHTMLを用意して、それぞれに指定されたhref属性とsrc属性を抜き出してみる。

<html>
  <head>
    <title>TEST</title>
  </head>
  <body>
    <a href="http://kirinji.amayan.jp/"><img src="http://kirinji.amayan.jp/kirinji_top.gif"></a>
  </body>
</html>

で、これをHTML::Parserで解析してみる。

#!/usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

## サンプルHTML
my $html =<< "END_OF_HTML";
<html>
  <head>
    <title>TEST</title>
  </head>
  <body>
    <a href="http://kirinji.amayan.jp/"><img src="http://kirinji.amayan.jp/kirinji_top.gif"></a>
  </body>
</html>
END_OF_HTML

## HTML::Parser呼び出し
my $parser = HTML::Parser->new(
    api_version => 3,

    ## 開始タグ(<a href="..>")を読み込んだときに毎回発生するイベント
    ##   左から、
    ##   「イベント発生時に呼び出すメソッドへのリファレンス」
    ##   「メソッドに渡す引数の種類選択」
    ##     - selfは自分自身のクラス
    ##     - tagnameはタグ名前(a とか img とか。小文字変換されている)
    ##     - attrはタグ内要素のハッシュリファレンス(要素名 => 値 で入ってる)
    ##     - textはタグで囲まれたテキスト
    start_h     => [\&read_tags, "self, tagname, attr, text"],
    marked_sections => 1,
);

$parser->parse($html);

## イベント発生時のメソッドを定義
sub read_tags {
  my ($self, $tagname, $attr, $text) = @_;  ## 上で選んだ引数が渡ってくる 

  my $href = $attr->{href} if ($tagname eq 'a');
  my $src  = $attr->{src}  if ($tagname eq 'img');

  print "href = $href" . "\n" . "imgsrc = $src" . "\n";
}

こんな感じのスクリプトを走らせると、こんな結果になります。

href = http://kirinji.amayan.jp/
imgsrc = http://kirinji.amayan.jp/kirinji_top.gif

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証