PERLのWeb::Scraperモジュールに関しての質問です。


PERLのWeb::Scraperモジュールを使い
my $scraper = scraper {
process 'table.ranking tr','data[]' => scraper {
process '//td[1]','RANK' =>'TEXT';
process '//td[2]','name' =>'TEXT';
process '//td[3]','country' =>'TEXT';
process '//td[4]','PT' =>'TEXT';
};
};
こんな感じで収集したデータから
MYSQLなどデータベースを使用せずに
nameで検索してあたった配列からRANKを呼び出したいのですが出来ますでしょうか?

出来る場合、表示の仕方も教えていただきたいです。
よろしくおねがいします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/19 14:51:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント100pt

正規表現で検索する方法です。

my $search_word = "○○ ○○"; # 検索する名前
for my $data (@{$res->{data}}) {
    if ($data->{name} =~ m/$search_word/o) {
        print "$data->{name}と一致したデータ:ランキング $data->{RANK}<br />\n";
        # すべてのデータ表示
        print "$data->{RANK} $data->{name} $data->{country} $data->{PT}<br />\n";
	}
}


フォームから送信された場合など、区切り文字が含まれているケースにも対応させる為には、次のように事前(※「for my $data ~」の直前)に置換しておくといいです。

$search_word =~ s/(?:・|\s)/ /; # 検索対象のデータに合わせて区切り文字を統一します。

※上記は、検索対象のデータの名前の区切りが半角スペースの場合ですが、もし「・」になっている場合は、「s/\s/・/」のようにします。

id:robopit

回答ありがとうございます。

基本的なやり方で出来るんですね。
勉強になりました。

2012/02/19 14:51:04
  • id:robopit
    ループの部分forではなくforeachです。
  • id:rouge_2008
    すみません。コメントに気がつくのが遅くなりました。
    ループの部分とは、回答のコードの事でしょうか?
    Web::Scraperのサンプルコードでforを使っていたのと、foreachはforのエイリアスであるという情報から、回答のコードではforを使用しました。

    http://d.hatena.ne.jp/perlcodesample/20091226/1264257759
    ----------------------------------------------------------
    foreachはforのエイリアスになっており実質は同じものです。
    ----------------------------------------------------------

    http://www.perlplus.jp/perl/for/index5.html
    http://it-scrap.blogspot.jp/2010/07/perl-for-foreach.html
  • id:robopit
    そうだったんですか
    打ち間違えだと思い見ている人がつまずかないように訂正いれといたのですが
    同じものならば問題ありませんね。
    失礼しました。

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

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

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

回答リクエストを送信したユーザーはいません