ページ毎に必要な箇所、情報の形式が違うので毎ページ全部書き直してるんだけど、長年の研鑽のためか(だって5年間パーサ書いてたようなもんだもんな)1ページあたり実装に10分かからないのは良いとして、
- start trigger
- end trigger
- regexp
どの行から読み込み始めるか
どの行で読み込み終えるか
どういう正規表現でオブジェクトを取得するか
だけで一応汎用化出来る気がした。最後の正規表現がミソで、上手くすれば一行に複数の取得したいオブジェクトがあっても配列化が行える筈、なんだけどどうすりゃいいのかね。
例えば
食文化に関する用語の一覧
だったら
<p><a href="/wiki/%E8%96%AC%E5%91%B3" title="薬味">薬味</a> <a href="/wiki/%E8%96%AC%E7%BC%B6" title="薬缶">やかん</a> <a href="/wiki/%E9%A3%B2%E8%8C%B6" title="飲茶">飲茶</a> <a href="/wiki/%E6%9C%89%E6%A9%9F%E8%BE%B2%E7%94%A3%E7%89%A9" title="有機農産物">有機農産物</a></p>
から
qw(薬味 やかん 飲茶 有機農産物)
のリストを取得するregexpが欲しい訳だ。当然欲しいオブジェクトの数は各行毎に可変である。
普段の僕だったら堅実にm%^<p>(.+?)</p>$%した上でs%</?a.*?>%%g;してsplit /¥s/なんだけど、一行で書くとしたら
@arr = $line =~ m%<p>(?:<a.*?>(.+?)</a>\s?)+</p>%
こうか?
うーん最後のマッチしか返してくれないなあ。どうやるんだろ。
逃げるんならregexp triggerとしてm%^<p>(.+?)</p>$%してregexpはwhile($line =~ m%<a.*?>(.+?)</a>\s?%){ ... }かな。
コメント (1)
うおお
http://blog.livedoor.jp/dankogai/archives/50816517.html
再帰しなきゃいけないような奴でもgotoで行ける!
投稿者: negipo | 2007年04月25日 09:40