perlでの質問です。

htmlを解析したいと思っています。
<div class="hoge">
取り出したい部分
</div>
のようなhtmlから上記の部分を抽出したいのです。
ただ上記のdivタグの間には違うdivタグが複数含まれている可能性があります。
正規表現ではうまくできなかったのでHTML::Parserってのを試してみたのですがうまくできませんでした。
この通りPerl初心者ですので、できるだけわかりやすく方法を教えてください。

回答の条件
  • 1人2回まで
  • 登録:2009/04/20 19:29:03
  • 終了:2009/04/26 12:37:32

回答(2件)

id:Mars No.1

Mars回答回数203ベストアンサー獲得回数202009/04/20 20:24:32

ポイント50pt

スマートにはほど遠いかと思うけどサンプルです。

(対応する</div>が無いときはまともに動きません)

$str=<<_SAMPLE_;
<div>
<div class="hoge">ABC
<div>ghi</div>
<div class="hage">ghi<div class="hage">ghi</div></div>
XYZ</div>
</div>
_SAMPLE_

my $result; # 結果
my $dips; # 開始divの数(開始div/閉じdivを見つけたら加算/減算)
my $x1; # 解析対象文字列 - マッチした文字列の右辺

$dips = $str =~ m/<div\s+class="hoge">/i;
$x1 = $';
while($dips){
	last unless($x1 =~ m{<div.*?>|</div>}i);
	$result .= $`;
	$x1 = $';
	if($& eq '</div>') {
		$dips--;
	} else {
		$dips++;
	}
	$result .= $& if($dips);
}
print $result;

↓結果

ABC
<div>ghi</div>
<div class="hage">ghi<div class="hage">ghi</div></div>
XYZ
id:komamix

シンプルだから使い勝手がいいですね。ありがとうございます。

2009/04/26 12:35:57
id:pmakino No.2

まきのっぴ回答回数353ベストアンサー獲得回数282009/04/20 20:20:37

ポイント50pt

HTML::Parser は取っつきづらいので、HTML::TreeBulder を使うと楽ですよ。

こんな感じでできます。

my $tree = HTML::TreeBuilder->new;

$tree->parse($content); # $content に解析対象の HTML が入っているものとする

my $target = $tree->look_down('_tag', 'div', 'class', 'hoge')->as_HTML;

print $target; # 取り出したかった部分

※HTML::TreeBuilder は Perl 標準モジュールではないので、ディストリビューションによっては標準でインストールされていません。最初に HTML::Tree パッケージインストールが必要な場合があります。

また、うまくいかない場合は試したコードを貼り付けておくと回答が付きやすいと思いますよ。

id:komamix

そうなんですね。たしかに動きがよくわかりませんでした。ちょっとモジュール入れられない環境なのでローカルで試してみます。ありがとうございます。

2009/04/26 12:37:11

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません