人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: komamix
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:HTML Perl タグ 初心者 抽出
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mars
●50ポイント

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

(対応する</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
◎質問者からの返答

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


2 ● まきのっぴ
●50ポイント

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 パッケージインストールが必要な場合があります。

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ