WikipediaのPHPによるAPIについて

このQ&Aのポイント
  • WikipediaのAPIをPHPで利用する方法について調べています。
  • サンプルコードを使ってWikipediaの情報を取得し、表示する方法についても説明されています。
  • しかし、実際に動かしてみると、Wikipediaの検索結果と異なる結果が表示されています。
回答を見る
  • ベストアンサー

WikipediaのPHPによるAPIについて

http://wikipedia.simpleapi.net/ にサンプルが出ていて、それを利用しようと思っています。 --以下サンプル <?php // キーワード指定 $keyword = "多田富雄"; // APIのURL $url = "http://wikipedia.simpleapi.net/api?keyword=".urlencode($keyword)."&output=php"; // データを取得 $data = file_get_contents($url) ; // PHPシリアライズパーサーを利用して解析し、配列に入れる $array = unserialize($data); // 配列をforeachで表示するデモ print "<H1>Wikipedia情報</H1>"; foreach ($array as $key => $value) { print "<a href=\"".$value[url]."\"><strong>".$value[title]."</strong></a>\n<br/>". $value[body] ."<hr/>\n\n"; } ?> --サンプル以上 実際のwikipediaで"多田富雄"を入力し調べた時と、上記サンプルを起動してprintした時では内容が異なります。 (上記サンプルの方がかなり少ない) unserialize関数もしくはfile_get_contents関数か、別の要因かよくわかりません。 ご経験のおありの方、ヒントだけでもいただけると助かります。 なお、私のphp経験は50-100時間程度、環境はXP,Apache2,php5です。

  • idek
  • お礼率47% (170/361)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

SimpleAPIのサイトのほうを確認させていただきました。 「その言葉に関するwikipediaの記述をダイジェストとして返します。」 と記述されている通り、全文検索には対応していないようです。 どうしても全文が必要な場合は、自身でWikipediaの検索結果のHTMLをスクレイピングするなどして対応する必要がありそうです。

idek
質問者

補足

>SimpleAPIのサイトのほうを確認させていただきました。 >「その言葉に関するwikipediaの記述をダイジェストとして返します。」 >と記述されている通り、全文検索には対応していないようです。 ここまで調べていただきありがとうございます。 >HTMLをスクレイピング http://www.usamimi.info/~ryouchi/scraping/index.html にPHPでスクレイピングする方法がでていました。 やってみます。

その他の回答 (1)

回答No.1

unserializeした配列を、そのまま、print_r関数で出力した場合にも、データが少ないのでしょうか。

idek
質問者

お礼

早速ご指摘頂き、ありがとうございます。

idek
質問者

補足

$array = unserialize($data); の次に、 print_r($array); を追加しても表示される内容は全く同じでした。 =データは少ないままです。

関連するQ&A

  • APIで検索結果を1件だけ取得する方法を教えてください

    日曜プログラマーのため、プログラミング知識が乏しいのですが質問させてください。 「Simple API」というサイトのWikipedia APIのサービスを利用しようと考えているのですが、 サイト上で紹介されているPHPサンプルですと、キーワードによっては複数件の結果を取得してしまいます。 --------以下サンプル------- <?php // キーワード指定 $keyword = "東京"; // APIのURL $url = "http://wikipedia.simpleapi.net/api?keyword=".urlencode($keyword)."&output=php"; // データを取得 $data = file_get_contents($url) ; // PHPシリアライズパーサーを利用して解析し、配列に入れる $array = unserialize($data); // 配列をforeachで表示するデモ print "<H1>Wikipedia情報</H1>"; foreach ($array as $key => $value) { print "<a href=\"".$value[url]."\"><strong>".$value[title]."</strong></a>\n<br/>". $value[body] ."<hr/>\n\n"; } ?> ------------------ 私のやりたいこととしては、検索キーワードに対して1件目の結果のみ表示させたいのですが、うまいやり方がわからず困っています。 (データ取得自体は1件のみでも複数件でも構わないのですが、表示は1件目のみさせたいです) どなたか1件目の結果のみ表示されるサンプルコードをご教授願えませんでしょうか。 よろしくお願いいたします。 【SimpleAPI vol.3 - Wikipedia API】 http://wikipedia.simpleapi.net/

    • ベストアンサー
    • PHP
  • wikipediaのAPIの取り込みについて

    wikipediaのAPIを取り込みたいと思っています。 以下のURLをIE6から叩けば、「東京ドーム」に関するwikipediaの情報がxmlの形式で表示されるのですが、 http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Export/%e6%9d%b1%e4%ba%ac%e3%83%89%e3%83%bc%e3%83%a0 これを、 use LWP::Simple; $url = "http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Export/%E3%83%8A%E3%82%B9%E3%82%AB%E3%81%AE%E5%9C%B0%E4%B8%8A%E7%B5%B5"; $res = get($url); print $res; exit; としても、取得できません。 どなたか、このwikipediaのURLから情報をperlで取得する方法を教えていただけませんか。お願いします。 #なお、perl初心者です。 #サンプルコードを試行錯誤で書き換えしながら先に進むタイプです。 ちなみに、SimpleAPI(http://wikipedia.simpleapi.net/)による「東京ドーム」の取得は出来るのですが、 #上記コードの$urlを"http://wikipedia.simpleapi.net/api?keyword=%E6%9D%B1%E4%BA%AC%E3%83%89%E3%83%BC%E3%83%A0&output=xml"にする。 この場合、ダイジェスト文だけで全文は取得できません。 無謀かもしれませんが、全文を取得したく、前者のURLからの取得を望んでいます。 どうかよろしくお願いします。

  • PHPの読解お願いいたします

    PHP初心者です。 環境 XAMPP1.7.0(最新) アパッチなど一括ダウンロード OS:ビスタ 多次元配列について以下のコードについて疑問があります。 ●の部分が疑問点となっております ~~~~~~~~~~~~~~~~~~~~~~~~~~~ <body> <table border="2"> <tr> <th>都市名</th><th>最高気温</th><th>最低気温</th> </tr> <?php $data=array( array("東京",32,25), array("名古屋",28,21), array("大阪",27,20), array("京都",26,19), array("福岡",27,22), ) foreach($data as $city){ print "<tr>"; ● foreach($city as $value) print "<td>{$value}</td>"; ●● } print "</tr>"; ?> </table> </body> </html> ~~~~~~~~~~~~~~~~~~~~~~~~~~ ●・・ここで<tr>を持ってくる必然性がわかりません。 例えば print "<td>{$value}</td>"のコードの<td>の横に付けることでも可能ではないのしょうか? ●●・・foreachがネストになり、多次元配列となっています。 まず$dataを取得しそれぞれを$cityに格納、次のforeachで$cityに格納された1行目のarray("東京",32,25)を一つづつ$valueに格納していくのだとは思いますが、例えばこのforeachネストの一連の流れを以下のように1つのforeachで記載することがなぜエラーになるのか分かりません。 foreac($data as $city){ print "<tr><td>{$city}</td></tr>" } $cityの中にはarray("東京",32,25) array("名古屋",28,21), array("大阪",27,20),array("京都",26,19),array("福岡",27,22), が格納されているので、別にこれをネストして{$value}に格納しなくてもそのまま変数$cityのみで表を作成できるのではないかと思っています。 まあでもエラーが出ますので、私の考えに大きな誤りがあるわけですが、誤っている部分をご指摘ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • [PHP] AITalkの音声合成APIで困った

    file_get_contents の返り値が false で困っています!! Docomoさんがエーアイさんの音声合成APIを提供しています. エーアイの音声合成APIの中でも,「SSML」を利用しようとしています. ・ドコモさんのHP https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=70 ・SSMLについて https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=71#tag01 SSMLを利用しようとPHPで実装して実行するも file_get_contents でエラーになってしまいます. (エラー:failed to open stream: HTTP request failed! ) コードは以下のように記述しました. <?php // コード書く際に参考にしたサイト // http://www.d-labo.net/laboratory/php/7001.php // http://stackoverflow.com/questions/9412650/how-to-fix-411-length-required-error-with-file-get-contents-and-the-expedia-xml function post($url, $data) { if (!ini_get('allow_url_fopen')) throw new Exception("Not Allowed URL Open!"); //headersは仕様通りに記述したつもり $headers = array( 'Content-Type:application/ssml+xml', 'Accept:audio/L16', 'Content-Length:'.sprintf("%d",strlen($data)) ); //methodは必ずPOSTと仕様書にあった $stream = stream_context_create(array('http' => array( 'method' => 'POST', 'header' => implode("\n",$headers), 'content' => $data ))); //XXX: file_get_contentsの返り値が必ず false になってしまう return file_get_contents($url, false, $stream); } ////// usage sample ////// 申し訳ないのですが,APIKEYを第三者に提供することはできません. try { $url = 'https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=XXXXXXXXXX'; $xml = '<?xml version="1.0" encoding="utf-8" ?><speak version="1.1"><voice name="nozomi">エーアイの音声合成エンジンによる音声です。</voice><break time="1000ms" /><voice name="seiji">エーアイの音声合成エンジンによる音声です。</voice></speak>'; $hoge = post($url,$xml); var_dump($hoge); } catch (Exception $e) { var_dump($e); } ?> 以上のコードが記述されたファイル(text_to_voice.php)をターミナルで実行 $ php text_to_voice.php Warning: file_get_contents(https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=XXXXXXXXX): failed to open stream: HTTP request failed! in text_to_voice.php on line 26 bool(false) 以上になります.どうやったら file_get_contents の返り値が false じゃなくなるのか知りたいです. よろしくお願い致します. 画像にはリクエストヘッダーの内容とAPIのURLが記述されており, 画像にあるのを参照しました.

    • ベストアンサー
    • PHP
  • php配列確認に関して

    $name = array( '0' => 'test', '1' => 'test1', '2' => 'test2', '3' => 'test4', '4' => array( '0' => 'e', '1' => 'r', '2' => 'y', '3' => 'i', ), ); foreach ($name as $key => $value) } print $value; } このうえの配列を確認したいのですが print $value;でやると 4がarrayとなってしまいます 4の中身を確認したいのですか foreachの下に何を書けばいいでしょうか?

    • ベストアンサー
    • PHP
  • PHPの多次元配列について

    HTMLでホームページを作れる以外はプログラムに関しほぼ素人です。 環境 XAMPP1.70(最新)にてアパッチなど一括ダウンロード PHP言語にて3×4の表で以下の数値を多次元配列にて作成しようと思っているのですが、当方初心者なもので、 以下のコード(細かい部分は省略しています)、特にforeachがネストになっている部分の処理の流れがいまいちよくわかりません ~~~~~~~~~~~~~~~~~~~~~~~~~ <table border=2> <th>都市名</th> <th>最高気温</th> <th>最低気温</th> <?php  $data=array( array("東京"32,25) array("名古屋",45,67) array("埼玉",32,67) array("大阪",86,34) ) foreach($data as $city){ print "<tr>"; foreach($city as $value){ print "<td>{$value}</td>"    ●1回目foreachからここまでの流れがいまいち分かりません } print "</tr>"; ?> ~~~~~~~~~~~~~~~~~~~~ 一つ目のforeachにて、配列$dataが指定されていますので外側の配列を処理していくと思うのですが、具体的にどういう順番で処理されていくのでしょうか。 またforeach()の中の"$cityが最終的に$valueに格納という形になっていますが、10~13行目のarray("東京",32,25)とどのような関係で処理されていっているのか教えていただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで配列を使ってHTMLソースを取得したいです

    RSSで取得したXMLの中身からURLを取得したのですが、 それぞれのソースをループ構文を使って取得する方法はありますか? XMLの中身を配列として表示すると ソース↓ $RSS_data = simplexml_load_file($RSS_url); $i=0; foreach($RSS_data->URL as $value){ $result [$i] ['URL'] = $value->URL; $i++; } echo "<pre>" ; print_r($result) ; echo "</pre>" ; 結果↓ Array ( [0] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www.~ ) ) [1] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www~ ) ) [2] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www.~ ) ) [3] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www.~ ) ) こんな感じで続いていきます。 このURLの一つ一つのソースを取得したいのですがどうすればいいのでしょうか?

    • 締切済み
    • PHP
  • foreach のバグでしょうか。PHP 5.3.3 で悩んだところが

    foreach のバグでしょうか。PHP 5.3.3 で悩んだところがあります。 あるレコードが正規表現にマッチした場合、そのレコードに対して何らかの処理をするスクリプトを書いていました。 しかし思ったように動かず原因を調べました。結果、配列の値が変わっていることに気づきました。  ◇テスト用レコードの内容   http://www.yahoo.co.jp/   http://www.bing.com/   http://www.goo.ne.jp/   http://www.google.co.jp   http://d.hatena.ne.jp/  ◇先頭一致して欲しい文字列   http://www.google.co.jp/   http://www.bing.com/   http://www.youtube.com/  この場合、処理の対象は2件です。  私が書いたスクリプトでは3回マッチしてしまいます。  以下、テスト用に作ったスクリプトです。 <?php // URL のパターンを用意 (とりあえず以下の3パターン) $ar = array(); $ar['Google'] = array(  'URL' => 'http://www.google.co.jp/' ); $ar['Bing'] = array(  'URL' => 'http://www.bing.com/' ); $ar['YouTube'] = array(  'URL' => 'http://www.youtube.com/' ); // 先頭一致の正規表現にする foreach($ar as $key => &$value){  $value['regex'] = '/^' . preg_quote($value['URL'], '/') . '/'; } echo("URL の パターンを出力してみる/n"); print_r($ar); // テスト用 レコード $list = array(); $list[] = 'http://www.yahoo.co.jp/'; $list[] = 'http://www.bing.com/'; // match. $list[] = 'http://www.goo.ne.jp/'; $list[] = 'http://www.google.co.jp/'; // match. $list[] = 'http://d.hatena.ne.jp/'; // マッチするのは2回のみ...のはずが for($n = 0; $n < count($list); $n ++){  foreach($ar as $key => $value){   if(preg_match($value['regex'], $list[$n], $match)) echo("match.\n");  } } echo("もう一度 URL のパターンを出力してみる\n"); print_r($ar); echo("なぜか一番最後の配列の値が変わっている。\n"); ?>

    • ベストアンサー
    • PHP
  • PHP apiのソート順について質問

    menu.phpでキーワード(りんご)で書き出した後は、問題なく りんご(ソート順:スタンダード)が表示されるのですが、さらに、search.phpでソート順を変えて検索するとソート順はリクエストURLに反映されるのですが、キーワード’(りんご)がリクエストURLに入りません。 search.phpでmenu.phpのキーワード(りんご)繰り返しし使うにはどのようにしたら、いいのでしょうか? [menu.php] <p><a href="search.php?word=りんご&sort=standard">りんご</a></p> [search.php] <?php $base = 'http://xxx.xxxxxx.co.jp/xxx/xxx'; $word =$_GET["word"]; $keyword = urlencode($word); $sort = $_GET["sort"]; $sort = urlencode($sort); // リクエストURL $url = $base ."&keyword=".$keyword."&sort=".$sort. ; ?> 表示順序 <select name="sort"> <option value="satandard">新着順</option> <option value="itemPrice">価格の安い順</option> <option value="-itemPrice">価格の高い順</option> <input type="submit" value="検索"> </select> よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP

専門家に質問してみよう