JSONデータ解析できない!Perlでitunes検索apiの結果を取得する方法

このQ&Aのポイント
  • JSON形式のデータ解析が出来なくて悩んでいます。Twitterから学ぶ,Web APIのキホンのサンプルプログラムを参考にitunesの検索apiの検索結果を解析しようとしているのですが解析できなく、何も表示されない状態になります。
  • 具体的には、itunes検索apiの検索結果(jsonデータ)から特定の項目を抜き出そうとしていますが、プログラムを実行しても結果が表示されません。
  • 解決策としては、プログラムの実行環境や保存形式、モジュールのインストールなどを確認することが重要です。また、デバッグのためにエラーメッセージを表示するなどの手法も有効です。
回答を見る
  • ベストアンサー

JSON形式のデータ解析が出来なくて悩んでます。

「Twitterから学ぶ,Web APIのキホン」(http://gihyo.jp/dev/serial/01/perl-hackers-hub/000403)のサンプルプログラムを参考にitunesの検索apiの検索結果を解析しようとしているのですが解析できなく、何も表示されない状態になります。 itunes 検索api http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html まずは上のSearch Examplesにいくつか示しているitunes apiの検索結果(jsonデータ)から"artistId"に対する項目や"artistName"に対する項目を抜き出そうと試みています。 以下は実際に私が実行しているプログラムです。 ----------------------------------------------------------------- print <<"HTML"; Content-type: text/html <html> HTML use LWP::UserAgent; use URI; use JSON qw(decode_json); use Encode qw(encode_utf8); my $uri = URI->new('※ここにitunes apiの検索結果のurl入れています'); my $ua = LWP::UserAgent->new; my $res = $ua->get($uri); my $json = $res->content; my $ref = decode_json($json); for my $applist ( @{ $ref->{results} } ) { print encode_utf8("$applist->{artistId}: $applist->{artistName}\n");} -------------------------------------------------------------------------------------- としているのですが結果は何も表示されません。※cgiはmac 環境にてUTF-8 Mac(CR)で保存しております。 「Twitterから学ぶ,Web APIのキホン」のサンプルプログラムは正常に動いて表示出来ているのでモジュールやPerlのパスには問題ないと思います。 どうすればitunes 検索apiのjsonデータがPerlでちゃんと解析されるのかご教示お願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

CGI としてブラウザでアクセスするのではなく、コマンドラインで実行するとデータが表示されませんか。 こちらで質問としてあげられたコードをコピペしてコマンドラインで実行すると JSON データはちゃんと表示されています。 CGI としてアクセスするとうまく表示されない理由は、このプログラムで作成される出力が HTML ドキュメントとして正しくないからです。 Content-Type: text/html と <html>との間には空行が必要ですし、なによりブラウザに表示するコンテンツは、<body></body> の間に入っていなければなりません。 HTML ドキュメントの構造について調べなおすことをお勧めします。

perlgogo
質問者

お礼

ありがとうございます。コマンドライン実行で表示出来ました! HTML記述の初歩的なミスでした。助かりました! ありがとうございます。

関連するQ&A

  • [Perl]Shift-JISのXMLを解析する場

    行き詰まってしまったので教えて下さい。 <やりたいこと> とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。 <問題> XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。 <元のXML> <?xml version="1.0" encoding="Shift_JIS"?>  <test>   <prod count=3>    <record>     <code>アイウエ</code>    </record>    <record>     <code>カキクケ-</code>    </record>    <record>     <code>ABC</code>    </record>   </prod>  </test> <XML解析用のコード> #!usr/bin/perl use utf8; use Encode qw/ from_to encode decode /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; use LWP::UserAgent; use XML::Simple; use Data::Dumper; #--XML取得部分省略 #--XMLはgetで$xmlに格納 $from = guess_encoding($xml)->name; &from_to($xml,$from,"utf8"); $XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = new XML::Simple(); $ref = $xs->XMLin($xml); $xml =~ s/<\?.*\?>//; for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){  $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'}; $name = encode('utf-8',$name); print "$i : $name\n"; } <結果> 黒ダイヤに?文字で文字化けして出力される。 どなたか原因がお分かりになりますでしょうか。 よろしくお願いいたします。

  • Perlのプログラムのエラーです。ローカルでは問題なく動きました。サー

    Perlのプログラムのエラーです。ローカルでは問題なく動きました。サーバはさくらサーバで文字コードはEUC-JPです。 CGIから文章をMECAPIという形態素解析APIに送って、品詞ごとにファイルに書き込みます。 Status: 500 Content-type: text/html Software error: Can't locate object method "content" via package "HTTP::Response=HASH(0x86e9250)" (perhaps you forgot to load "HTTP::Response=HASH(0x86e9250)"?) at test9.cgi line 49. #!/usr/local/bin/perl use strict; use warnings; use LWP::UserAgent; use Encode qw/encode decode/; use utf8; use CGI; use CGI::Carp qw( fatalsToBrowser); my $str; my $i; my $j; &main; sub main{ my $q = new CGI(); $str = $q->param( "words" ); $str = decode('euc-jp', $str); my $title = encode('euc-jp', "MeCab APIを呼出す"); my $h1 = encode('euc-jp', $str . "の品詞"); print $q->header( -type =>"text/html", -charset => "euc-jp" ); print "<meta http-equiv=\"refresh\" content=\"5;URL=./test2.html\">"; print $q->start_html( $title ), $q->h1( $h1 ), $q->start_ul; my $esc = CGI::escape($str); Encode::from_to($esc, "euc-jp", "utf8" ); my $ua = LWP::UserAgent->new; $ua->agent('PerlSample/0.1'); $ua->timeout(5); my $response = $ua->get('http://mimitako.net/api/mecapi.cgi?sentence=' . $esc . '&response=surface,feature'); Encode::from_to($response, "utf8", "euc-jp" ); my @res = split(/<word>/, $response->content); foreach $i (@res){ $i = decode('utf8', $i); my @wc = ("名詞", "動詞", "形容詞", "助動詞", "助詞" , "接頭詞" , "接続詞" , "記号" ); my @fn = ("N" , "V" , "A" , "MV" , "JOSHI","SETTOUSHI", "SETSUZOKUSHI", "KIGOU"); for($j=0; $j<@wc; $j++){ if($i =~ /<surface>(.+)<\/surface><feature>$wc[$j]/){ $str = encode('utf8', $1);#utf8 my $filename = encode('euc-jp', $fn[$j]); open(OUT, ">>./dir/$filename.txt"); Encode::from_to($fn[$j], "utf8", "euc-jp" ); print $fn[$j].$str." "; $str = encode('euc-jp', $1); Encode::from_to($str." ", "utf8", "euc-jp" ); print OUT "$str\n"; close(OUT); last; } } } }

  • HTTP::Request::Common qw(POST);時にソフト表だとエラーになる

    お世話になります。 HTTP::Request::Common qw(POST);を使ってPOSTする際、aaa=> 'あいう',などの日本語はPOST後、データが渡っている事が確認できるのですが、'ソフト表'等の文字列をあえて送ろうとすると、エラーになってしまいます。 記述はShift_JISで行っています。 先生方、ご教授ねがえませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use HTTP::Request::Common qw(POST); use LWP::UserAgent; #use open IN => ":utf8"; # 入力をUTF8とする #use open OUT => ":shiftjis"; #use open ":std"; #use Encode; use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'shiftjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #use open ":encoding(shiftjis)"; #require './jcode.pl'; my $ua = LWP::UserAgent->new; #タイムアウトを設定 $ua->timeout(10); my $req1 = POST 'http://domain.com/test.cgi', [ aaa => 'www1', bbb => "ソフト表" ,#bbb=> 'あいう',だとエラーになりません ]; print $ua->request($req1)->as_string;

    • ベストアンサー
    • Perl
  • HTML::TreeBuilderについてです

    perlで特定のhtmlタグの情報を抜き出そうとしてHTML::TreeBuilderを使おうとしているのですが、インストールして実行してもlook_downメソッドがないといわれます。 しっかりとインストールはしているのであるはずなのですが・・・ どうすればよいか皆目見当もつかないのでどうぞよろしくお願いします。 ちなみにコードは以下の通りです↓ use strict; use warnings; use LWP::UserAgent; use HTML::TreeBuilder; use HTML::Element; use Encode; # urlを指定する my $url = 'http://www.nikkansports.com/'; # IE8のフリをする my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; # LWPを使ってサイトにアクセスし、HTMLの内容を取得する my $ua = LWP::UserAgent->new; my $res = $ua->get($url); my $content = $res->content; # HTML::TreeBuilderで解析する my $tree = HTML::TreeBuilder->new; $tree->parse($content); $tree = decode("UTF-8",$tree); $tree = encode("Shift_JIS",$tree); # DOM操作してトピックの部分だけ抜き出す。 # <div id='topicsfb'><ul><li>....の部分を抽出する my @items = $tree->look_down('id', 'sideRanking')->find('li'); print $_->as_text."\n" for @items;

    • ベストアンサー
    • Perl
  • Amazon サイトからhtmlを取得すると文字化

    すみません。素人です。 Amazon サイトからhtmlを取得すると文字化けしてしまいます。 方法ってないでしょうか? *************** use strict; use warnings; use Web::Scraper; use URI; use Encode qw/encode_utf8/; my $scraper = scraper { process('div', 'title' => 'TEXT'); }; my $url = URI->new('https://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=test'); my $res = $scraper->scrape($url); print encode_utf8($res->{title}) . "\n"; ******************

    • ベストアンサー
    • Perl
  • Perlのコードを隠蔽する

    Perlのソースコードを隠蔽する&ActivePerlなどがない環境でも動くようにperl2exeを使って変換して配布しようと思っています。 逆コンパイラされる可能性が0ではないことはわかっています。 しかし、下記コードの実行がなかなかうまくいきません。実際の.plでの起動時ではうまくいくのですが、.exeに変換するとうまくいかないようです。回避方法を教えてください。 -------------------- use HTTP::Request::Common qw(POST); use LWP::UserAgent; my $ua = LWP::UserAgent->new; my %loginform = ('mail' => 'hogehoge@hoge.jp', 'password' => 'hogehoge'); my $request = POST('https://****/login', [%loginform]); my $res = $ua->request($request); my $cookie = $res->header('Set-Cookie'); --------------------

  • UTF-8で書かれたHTMLファイルをShift-JISのファイルに変換できない

    #!/usr/bin/perl -w =begin comment OS: Windows XP Perl: Active Perl v5.8.8 スクリプトは「Shift-JIS」で書いています。 日本語処理関係で参考にしているのはもっぱらオライリージャパンの「Spidering Hacks」の付録の翻訳者 による日本語処理の解説です。 http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、use encoding 'shiftjis'; から use encoding 'cp932'; へ変更している以外は そこに書かれているやり方に従っていると思います。 UTF-8で書かれたHTMLファイルを「LWP::UserAgent」で取得し、それを Shift-JISコードで出力したいと思い以下のコードを実行したのですが、 以下のエラーが出てしまいました。 Parsing of undecoded UTF-8 will give garbage when decoding entities at C:/usr/local/site/lib/LWP/Protocol.pm line 114. このエラーは何が原因なのでしょうか? =end comment =cut use strict; use LWP 5.64; use Encode; use encoding 'cp932'; # http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、'shiftjis'から'cp932'へ変更。 #use encoding 'shiftjis'; binmode(STDERR, ':raw :encoding(shiftjis)'); my $url = "http://www.audiounion.jp/bin/products/used/A0/-/-/"; my $browser = LWP::UserAgent->new; my $response = $browser->get( $url ); die "cannot get $url:", $response->status_line unless $response->is_success; my $content = Encode::decode('utf8', $response->content); print $content;

  • Perlで言う、LWP HTTPをPHPで

    PerlでのスクリプトをPHPに移行しようかと考えております。(勉強のため) それで、PerlのモジュールでいうLWPとHTTPに代わるクラスライブラリ(API)は、どれにあたるのでしょうか? 具体的には、LWP::UserAgentとHTTP::Requestです。 ※詳しくは、 my $wa = new LWP::UserAgent; my $req = new HTTP::Request(GET => $url); my $res = $wa->request($req); PHPのドキュメント(http://www.php.net/manual/ja/)を見たのですが、いまいちピンときませんでした。 参考URLで結構ですので、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CGI.pmのtextfieldのデフォルト文字列が文字化けしてしまいます。。

    CGI.pmのtextfieldの設定したデフォルト文字列が文字化けしてしまいます。。 以下のコードはちゃんと表示されるのですが。 print checkbox('only_exist', 'checked', 1, '削除済動画除外'); → <label><input type="checkbox" name="only_exist" value="1" />削除済動画除外</label> textfieldを使った以下のコードはちゃんと表示されません。。 print textfield('keyword', '削除済動画除外', 20); → <input type="text" name="keyword" value="&atilde;&sup2;&atilde;&atilde;‚‰&atilde;—" size="20" /> どっちもうまく表示されないのならわかるのですが、片方だけなので全く原因が分かりません。。 コードはUTF-8にて記述。(Non BOM) コード冒頭は #!/usr/bin/perl require 5.8.0; use utf8; use strict; use warnings; use Encode qw(decode encode); use CGI qw(:form param -nosticky -no_undef_params); use Data::Dumper; use POSIX 'strftime'; use LWP::UserAgent; use HTTP::Request; use open OUT => ":encoding(utf8)"; use open ":std"; use HTML::Entities 'encode_entities'; となっております。 アドバイスいただけると嬉しいです _ _

  • LWPモジュールでログインしHTML取得

    use LWP::UserAgent; use HTTP::Request::Common qw(POST); my $url = 'https://toto.netbk.co.jp/main/smm0100'; my %formdata = ('userName' => 'ID', 'loginPwdSet' => 'Pass'); my $request = POST($url,[%formdata]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); $ua->ssl_opts(verify_hostname => 0); my $res = $ua->request($request); print $res->as_string; サポートされないブラウザーで弾かれます 解決策、教えてください

専門家に質問してみよう