• ベストアンサー

Perlの正規表現について

はじめまして。kalkと申します。 Amazonにある商品の中古価格を取得するプログラムを見つけ、実際に動かしてみたのですが「商品が存在しません」と表示されてしまい、うまくいかず困っています。 http://www.amazrank.com/blog/archives/perl/ (Amazonマーケットプレイス商品情報の取得方法という記事です) どうやら、記事が書かれた当時とはAmazonのページのデザインが違うため最初の正規表現の部分がうまくいっていないようなのですが、どのように変更すればよいのでしょうか。 どなたか修正ができる方がいましたら、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.3

原因をみてみました(動作確認済です) 1.このページはUserAgentをセットしないと駄目なようです use LWP::Simple; my $html = LWP::Simple::get("http://www.amazon.co.jp/exec/obidos/tg/detail/offer-listing/-/$ARGV[0]/all/"); ↓ use LWP::UserAgent; my $url="http://www.amazon.co.jp/exec/obidos/tg/detail/offer-listing/-/$ARGV[0]/all/"; my $ua = LWP::UserAgent->new; $ua->agent('Mozilla'); my $html = $ua->request(HTTP::Request->new(GET => $url))->content; 2.たぶんshift-jisで編集してると思います Encode::from_to($html, "shiftjis", "euc-jp"); ↓ #Encode::from_to($html, "shiftjis", "euc-jp"); もしくは、EUCで編集してください その他(1カ所間違えてました) if($_ =~ /price[^>]*>(.*)<^\/span/ ){ ↓ if($_ =~ /price[^>]*>(.*)<\/span/ ){

kalk
質問者

お礼

いろいろと正規表現などを改良してみて、何とか情報を取得することができました! 丁寧なご説明、本当にありがとうございました。

kalk
質問者

補足

ご丁寧な返信、本当にありがとうございます。 何とか古本3冊の値段と品質の値を取ってくることが出来ました。 そこで、最後に1つだけお聞きしたいのですが、プログラムを改良して取得する値を3冊から10冊にしたのですが、5冊目以降あたりから Use of uninitialized value in concatenation (.) or string at sample.pl. というエラーが出てしまい困っています。 exit if ($total[0] == 1); print "2 ". $usedprices[1] . "" . $usedstatus[1] . "\n"; 上記の部分をコピペして10冊表示するようにしたので表示の部分は問題ないと思い、値がうまく取得できていないようなので正規表現の部分を改良いるのですが…どうも5冊目以降あたりからエラーが出てしまいます。 たびたびすみません。よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.2

商品がありませんと出るのはどのページでしょう? http://www.amazon.co.jp/exec/obidos/tg/detail/offer-listing/-/$ARGV[0]/all/ $ARGV[0]のところに目的商品の値を入れて商品は表示されていますか? ※おそらくこれは本専用です 例: http://www.amazon.co.jp/exec/obidos/tg/detail/offer-listing/-/4822244040/all/

kalk
質問者

補足

実際にコマンドプロンプトでperlプログラムを動かすと「商品が存在しません」と表示されてしまいます。 perl sample.pl 4822244040 ISBN:4822244040 商品が存在しません 在庫切れ といった感じです。 どの本のISBNを入力してもこの反応が返ってきてしまいます…(AmazonのHPで見る分には本の情報も古本の情報も普通に見られます)

すると、全ての回答が全文表示されます。
  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

HTMLの記述を見ながら直せばOKではないでしょうか? とりあえずこんな感じでどうでしょう #total ユーズド、コレクターズ、新品の3種類がある。 if($_ =~ /全(\d*)商品/ ){ push @total, $1; } #title if($_ =~ /title>.+:\s*(.*)<\/title/ ){ $title = $1; } #price if($_ =~ /price[^>]*>(.*)<^\/span/ ){ push @usedprices, $1; } #status if($_ =~ /^ - (.+)$/ ){ push @usedstatus, $1; } #stock if($_ =~ /strong>(.*発送.*します.*)<\/strong/){ $stock = $1; }

kalk
質問者

補足

返信ありがとうございました。 上記の部分を変更して動かしてみたのですが、またも「商品が存在しません」と表示されてしまい、うまくいきませんでした…。 pipipi523さんの正規表現を参考にHTMLで必要な部分が記述されている部分を抜き出して正規表現を行ったのですが、エラーを吐き出すか「商品が存在しません」と表示されてしまい困っています。 もしかして、正規表現の部分はもちろんのこと、正規表現以外の部分も変更が必要なのでしょうか…?

すると、全ての回答が全文表示されます。

関連するQ&A