youtube apiの謎

このQ&Aのポイント
  • googlenewsのapiにつづいてyoutubeのapiと格闘しています。目標:youtubeのデータベースに人名で検索をかけ、その結果のリスト(XML)の中から、動画タイトルと動画IDを取り出す。
  • 動画タイトルを取り出すには、どの部分をどう修正すればいいのでしょうか?$ua->timeout(3);の部分で、タイムアウト処理をかましているつもりなのですが、どうも稼働している様には感じません。この様なプログラムの場合に、タイムアウト処理をかませるには、どうしたらよいのでしょうか?
  • 動画タイトルの部分がHASH(0x856eaec)といた様な表示になってしまうのです。どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?)
回答を見る
  • ベストアンサー

youtube api HASH(0x856eaec)の謎

googlenewsのapiにつづいてyoutubeのapiと格闘しています。 その際、TreePPモジュールを利用しているのですが、 どうしても解決できない問題があり、御相談させて下さい。 目標:youtubeのデータベースに人名で検索をかけ、その結果のリスト(XML)の中から、動画タイトルと動画IDを取り出す。 で、以下のプログラムで、動画IDは取り出せるのですが、動画タイトルの部分が HASH(0x856eaec) といた様な表示になってしまうのです。 ●どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?) ●動画タイトルを取り出すには、どの部分をどう修正すればいいのでしょうか? ●$ua->timeout(3);の部分で、タイムアウト処理をかましているつもりなのですが、どうも稼働している様には感じません。この様なプログラムの場合に、タイムアウト処理をかませるには、どうしたらよいのでしょうか? 以上3点、アドバイスいただければ幸です。 尚、当該xmlのタグ構造はコチラで確認していただけます。 http://gdata.youtube.com/feeds/api/videos?vq=aiko&start-index=1&max-results=50&orderby=relevance&alt=atom 以下、そのプログラムです。 ------------------------------ #!/usr/local/bin/perl print <<"HTML"; Content-type: text/html <html> HTML # 動画スタートnoを乱数で決める srand; $startno = rand; $startno =( int($startno * 6))+1; # モジュールのロード use Jcode; use XML::TreePP; # 検索単語の設定 $searchword = "aiko"; use Encode; #検索キーワードをUTF-8コードに変換する Encode::from_to($searchword , 'sjis', 'utf8'); #URLエンコードを行う $searchword=~s/([^0-9A-Za-z_])/'%'.unpack('H2',$1)/ge; $searchword=~s/\s/+/g; use LWP::UserAgent; use HTTP::Request; my $url = 'http://gdata.youtube.com/feeds/api/videos?vq='.$searchword.'&start-index='.$startno.'&max-results=50&orderby=relevance&alt=atom'; # XML::TreePPオブジェクトの作成 my $tpp = XML::TreePP->new( force_array => [ "entry" ], ); # parsehttpメソッドでURLからXMLデータを取得して $tree変数に格納 my $tree = $tpp->parsehttp( GET => "$url" ); $ua = LWP::UserAgent->new(); $tpp->set( lwp_useragent => $ua ); $ua->timeout(3); # [rss] - [channel] - [item] を $Items変数に格納 my $Items = $tree->{feed}->{entry}; # 検索結果を表示 foreach my $hash (@$Items){ $urlyou=$hash->{id}; $titleyou=$hash->{title}; $idyou = substr($urlyou,42,11); print "$titleyou".$idyou."<BR>"; }

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>$titleyouと同じ扱い方をしている$urlyouや$idyouも、同様に、HASH(0x856eaec) の様な形で出力されると思うのですが、 > これらに関しては、求めている値(URLやID)が出力されます。 > この違いは何なのでしょうか? これは元のXMLデータがどのようなフォーマットになっているのか、 また、それを XML::TreePP がどのように解析するかの問題でしょう。 ですから違いは何か、といわれても違うように扱われる何かがあるんでしょうねえとしか。 > -type:#text > この1行のみが表示されました。 ということは、 $titleyou=$hash->{title}; $hash->{title} からたどれるハッシュには '-type' と '#text' という 二つのキーがあるということですね。 '#text'の方に本体があるっぽいので、 $titleyou = $hash->{title}->{#text}; とすればタイトルの文章が取れそうな気がします。 '-type' の方は何かの説明でも入るんですかねえ。 こっちも $hash->{title}->{-type}; で内容が取れるはずなんで、一応チェックしてみてください。

keeeeeeen
質問者

お礼

sakusaker7様へ 夜分に誠にありがとうございます。 >これは元のXMLデータがどのようなフォーマットになっているのか、 また、それを XML::TreePP がどのように解析するかの問題でしょう。 全く同じに取り扱っても、結果が全く違うフォーマットで出力されることがありうるのですね。XMLデータを見ると、どちらも単なる文字データとしか見えないので、TreePPの解析側に原因がありそうです。 >$hash->{title} からたどれるハッシュには '-type' と '#text' という >二つのキーがあるということですね。 -type:#textという1つのキーではなく、 '-type' と '#text' という2つのキーなのですね! (この点を勘違いしていました) >'#text'の方に本体があるっぽいので、 >$titleyou = $hash->{title}->{#text}; >とすればタイトルの文章が取れそうな気がします。 タイトルがとれました! ありがとうございます! >'-type' の方は何かの説明でも入るんですかねえ。 >こっちも >$hash->{title}->{-type}; >で内容が取れるはずなんで、一応チェックしてみてください。 チェックしてみたところ、全て text という文字が返ってきました。 文字データのタイプはtextですよ、という説明の様です。 ということは、文字タイプがtextという説明がある場合、TreePPは リファレンスを返す様にできている様です。 御陰で、今後、リファレンスの問題が起こった時、どうすればよいのかが分かりました(今まで、別のプログラムで、本筋と関係ないところで、偶然?同様の表示を目にしたことがありました)。 これで、 ●ハッシュ変数の謎 ●キーを取り出す方法 ●取り出されたキーの見方 ●キーから要素を取り出す方法 以上4点が分かりました。 これで前に進む事ができます。 この度は、丁寧に指導いただき、誠にありがとうございました! 心より感謝致します。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?) ハッシュリファレンスを通常の変数のように出力しようとしたときにそうなります。 ですので、その変数 $titleyou=$hash->{title}; ↑これですか? をさらにハッシュリファレンスであるとしてさらにデリファレンスしてやればよいです。 具体的にどういうハッシュなのかはわかりませんが、 とりあえず print join ':', keys %{$titleyou}; とかしてキーの一覧でもとってみれば見当がつくかもしれません。 #Data::Dumper などでダンプしてもいいですけど。

keeeeeeen
質問者

お礼

sakusaker7様 早速のアドバイス、ありがとうございます。 ハッシュリファレンスについて、あれこれ調べて、いろいろ試したのですが、なかなかうまくいきません、、、。 >ハッシュリファレンスを通常の変数のように出力しようとしたときにそうなります。 なるほど。そういうことですか! が、ここで1つ疑問が。 であれば、$titleyouと同じ扱い方をしている$urlyouや$idyouも、同様に、HASH(0x856eaec) の様な形で出力されると思うのですが、これらに関しては、求めている値(URLやID)が出力されます。 この違いは何なのでしょうか? >print join ':', keys %{$titleyou}; >とかしてキーの一覧でもとってみれば見当がつくかもしれません。 上記のプログラムの最後に、この一行を入れて表示させてみたところ、、、 -type:#text この1行のみが表示されました。 ここで行き詰まっています。 引き続きアドバイスいただければ幸です。

関連するQ&A

  • HASH(0xほげほげ)

    出力が”HASH(0x197fa1c)”のような場合、どう解析してけばいいでしょうか? --------------------------------------------------------------------- #!C:\Perl\bin\perl.exe -w use strict; use Win32::OLE::OPC; #変数↓ my $items_stringP1 = "PLC0"; #OPCServer のデバイス名 my $items_stringP2 = "D"; #MELSECのデバイス名称 my $items_stringP3 = 0; #先頭アドレス my $maxcount = 1; #点数(5) #変数↑ my $opcintf = Win32::OLE::OPC->new('OPC.Automation', 'Takebishi.Dxp'); my $group = $opcintf->OPCGroups->Add('grp'); my $items = $group->OPCItems; my $items_stringP3_Min = $items_stringP3; my $count = 0; while ($count < $maxcount){ my $items_string=$items_stringP1.".".$items_stringP2.$items_stringP3; $items_stringP3 ++; $count ++; $items->AddItem($items_string, $opcintf); } print "********************"."\n"; print $items ."\n"; print "********************"."\n"; my $key; foreach ( keys %$items) { print "キー値 : $key\n"; } --------------------------------------------------------------------- 出力結果:↓ ******************** Win32::OLE::OPC::Items=HASH(0x197fa1c) ******************** Use of uninitialized value $key in concatenation (.) or string at C:\testPerl\OPC\OPC08.pl line 38. キー値 : Use of uninitialized value $key in concatenation (.) or string at C:\testPerl\OPC\OPC08.pl line 38. キー値 : Use of uninitialized value $key in concatenation (.) or string at C:\testPerl\OPC\OPC08.pl line 38. キー値 :

    • ベストアンサー
    • 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
  • CGIの接続エラー

    PerlのLWP::UserAgentを使った接続で,エラーが生じてしまいます. ローカルからなら期待通りにページ内容を取得できるのですが,サーバに配置してブラウザからアクセスするとInternal Server Errorとなります. プロキシは使っていません.ファイアウォールやセキュリティソフトを切ってもエラーが生じてしまいます. 対象URL(下のコードではhttp://wikipedia.simpleapi.net/api?keyword=YouTube&output=xml)を変えても同じ結果になります. 理由がわかる方がいらっしゃればご教授願います. CGIにPerl5,サーバにApache Tomcat 5.5を利用しています. エラー内容とコードは下のようになっています. エラー内容 「500 Can't connect to wikipedia.simpleapi.net:80 (Bad hostname 'wikipedia.simpleapi.net')」 コード #!/usr/local/bin/perl use LWP::UserAgent; print "Content-type: text/plain\n\n"; my $ua = LWP::UserAgent->new; $ua->agent("Mozilla/5.0"); my $req = HTTP::Request->new(GET => "http://wikipedia.simpleapi.net/api?keyword=YouTube&output=xml"); my $res = $ua->request($req); $res = $ua->request($req); my $content = $res->content; print $content; exit;

  • 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; サポートされないブラウザーで弾かれます 解決策、教えてください

  • LWPでヘッダー情報をあらかじめ取得したい

    例えば、下記のようなスクリプトの場合、一度画像が保存された後、ファイルサイズをを抜き出すようになります。 ダウンロード前に、ファイルサイズをあらかじめ知りたいのですがどのようにしたら良いでしょうか? use strict; my $url = "http://img.www.goo.ne.jp/img/gh_logo.png"; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request; use HTTP::Headers; my $req = HTTP::Request->new(GET => $url); my $ua = LWP::UserAgent->new; $ua->agent( 'Mozilla/5.0 (Windows NT 6.0; rv:12.0)' ); $ua->timeout('10'); $ua->max_redirect(); $ua->cookie_jar( HTTP::Cookies->new( file => '', autosave => 1, )); my $res = $ua->request($req, "save.png"); my $file_size = $res->header("content-length"); print $file_size;

    • ベストアンサー
    • 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'); --------------------

  • 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
  • Perl LWPでproxyがうまく刺さらない

    Perl初心者です。 LWPでどうしてもproxyが通りません・・・。 何が悪いのかわかりません。教えてください。 モジュールは全て導入を確認しました。 よろしくお願いします。 稚拙なミスだったらごめんなさい。 use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; my $ua = LWP::UserAgent->new( timeout=>"5" ); #cybersyndromeさんからLWP::Simpleでproxyを取得 $_ = get('http://www.cybersyndrome.net/pla5.html'); #proxyをリストに代入 (@proxy_list)=/\"\>(.*?)\<\/a\>\<\/li\>\<li\>/g; #適当なサイトをリクエストのターゲットに $r = new HTTP::Request GET,('http://taruo.net/e/'); #前述のターゲットへリクエストしてひとつづつproxyが通るか確かめたいのに何故かすべてすぐにERRORに for($i = 0;$i <= 10;$i++){ $proxy = 'http://'.$proxy_list[$i]; $ua->proxy ([qw(http https)] , $proxy); $req = $ua->request($r); if ($req->is_success) { print "Success!\n"; }else{ print "Error\n"; } }

    • ベストアンサー
    • Perl
  • LWP Cookie取得

    恐れ入ります。 LWPで、特定サイトにアクセスした時に発行されるCookieを任意のディレクトリに保存したいのですが、どのようにしたらよいかわかりません。 use HTTP::Cookies; use LWP::UserAgent; $ua = LWP::UserAgent->new(); $cookie_file = './cookie/xxx.txt'; $cookie_jar = HTTP::Cookies->new(file => $cookie_file, autosave => 1); $url = "http://~~"; $response = $ua->get($url); print $response->content; で、コンテンツは表示されますが、xxx.txtにcookieが保存されません。 #LWP-Cookies-1.0 のみが記載された白紙のxxx.txtが精製されます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlでgoogle newsのRSSを取得2

    質問を閉め切った直後に気付いたもので、すいません!! QNo.3797932の、つづきなのですが、、、 教えていただいた以下の方法 ------------------------- #!/usr/local/bin/perl use LWP::Simple; use XML::RSS; use LWP::UserAgent; my $url = 'http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko'; my $ua = new LWP::UserAgent; my $responce = $ua->get($url, 'User-Agent' => 'Mozilla/4.0'); my $data_from_web = $responce->content; print <<"HTML"; Content-type: text/html <html> HTML print $data_from_web; exit; ------------------------- の場合だと、ページ表示データは取得できるのですが、RSS特有のタグが 抜け落ちる為、その後の解析ができない事に気付きました。 なんとか、RSS特有のタグも含めてのRSS情報を入手する方法はないでしょうか? ちなみに、RSS特有のタグも含めてのRSS情報は、ブラウザーのURLの窓に http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko このアドレスを直接入力してリターンキーを押すと、確認する事ができます。 度々申し訳ないのですが、よろしくご指導、お願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう