Perlの正規表現についての質問です。続きの質問ですので、お手数ですが先に

http://q.hatena.ne.jp/1218906142
に目を通していただけるとありがたいです。掲示板のデータを取得して、正規表現でシリアル、タイトル、名前、日付、書き込み内容を抜き出して保存したいと考えています。前回は1件だけ取得するところまではOKでしたが、ループで回していくと、書き込み内容の部分だけ、マッチしたりしなかったりします。しかも、実行するたびにマッチする行、しない行が違ってきたりします(例えば10回フープすれば2,3,5,6行だけしない、など)。何度も見直したのですが、なぜ同条件でこういった結果になるのかが分かりません。何かこういう問題を引き起こす原因に心当たりがありましたら、ご指摘ください。
字数制限でコードや実行結果を書けませんが、お答えいただければコメントで詳しくお伝えできると思います。完全に行き詰まってしまいました。どうか宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/08/22 02:13:31
  • 終了:2008/08/22 18:53:04

ベストアンサー

id:m_nagase No.1

nagase回答回数58ベストアンサー獲得回数82008/08/22 12:14:42

ポイント100pt

前回質問のサンプルソースでページの取得にわざわざLWP::UserAgentを使う必要は無いかと思います。

LWP::Simpleを使って以下のようにすればうまく行きました。

use LWP::Simple;

for(my $i = 1;$i <= 10;$i++){ # とりあえず10ページ取得
  my $url = "http://otd1.jbbs.livedoor.jp/18972/bbs_plain?base=$i&range=1";
  parse(get($url));
}

sub parse{
  my ($data) = @_;
  my $decoder = Encode::Guess->guess($data);
  my $string = $decoder->decode($data);

  ...
id:mine-D

おおおおお!すごい。本当だ。いけました。大感謝です。

CPANモジュール(というかPerlそのもの)をほとんど初めて使ったんですが、どのモジュールを選ぶかというのも重要なんですね。LWP::UserAgentは内部的にややこしい事をやっているとか、そんな感じなんでしょうか?

あっという間に解決していただいて、びっくり&感嘆しております。ありがとうございます!

2008/08/22 17:49:26
  • id:m_nagase
    前回質問時にも指摘されていましたが、掲示板データがどのような形式であるかを示してもらわないと、適切な回答が出来ないと思われます。
  • id:mine-D
    あ、前回にも書いたのですが、掲示板は
    http://otd1.jbbs.livedoor.jp/18972/bbs_plain?base=1&range=1
    です。base=の数字をインクリメントしていって、一件一件ループで回していくつもりです。
    できればHTMLのソースを見ていただいて、なぜマッチしないのか、についてヒントいただけるとありがたいです。
  • id:m_nagase
    前の質問にあったソースをいじって確認してみましたが、sub perse() 内の $data にセットされているデータが、取得するページによって途中で切れてますね。Windows上の perl 5.8.8 ですが、6888バイトより長いと後が切れるようです。ということで正規表現うんぬんではなくて、データ取得時の問題のようです。
  • id:mine-D
    コメントありがとうございます。そういう制限があったとは知りませんでした。ただ、私の実行環境はcoLinux上にインストールしたFedoraCore4ですので、Windowsではないんですね…。Unix環境でも同じ制限があるのかな。ちょっとその辺を調べてみますね。感謝です。

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

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

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

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