WikipediaのAPIについて

PHPでWeb APIの勉強を始めました。

http://ja.wikipedia.org/wiki/海軍兵学校卒業生一覧_(日本)
で一覧ページが表示されます。

このページをPHPのimplexml_load_file()を使って
xmlの文書でほしいのですが、こういう事は不可能なのでしょうか。

ちなみに
以下だとxmlが返ってきます。
1,2行目無視してください
<?php
require_once("apiconfig.php");
require_once("apifunc.php");
$keyword="アラブ種";
$keyword4url=urlencode($keyword);
$url="http://wikipedia.simpleapi.net/api?keyword=$keyword4url&output=xml";
$xml=simplexml_load_file($url);
print_r($xml);;
?>

*上記の「アラブ種」という文字をを、
「海軍兵学校卒業生一覧_(日本)」という文字に置き換えると、
Warning: が出てきて、xmlが表示されません。

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

ベストアンサー

id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

parser error : Document is emptyとなりますし、
http://wikipedia.simpleapi.net/ で入力してみても、
ブラウザのアドレス欄にエンコード後のアドレスを直接入れてみてもダメですね

http://wikipedia.simpleapi.net/api?keyword=%E6%B5%B7%E8%BB%8D%E5%85%B5%E5%AD%A6%E6%A0%A1%E5%8D%92%E6%A5%AD%E7%94%9F%E4%B8%80%E8%A6%A7%28%E6%97%A5%E6%9C%AC%29&output=xml

アラブ種については出ますので、プログラムコードの問題でも、
ましてや文字コードの問題などでもなく、
サーバーサイドのデータ更新が滞っていると考えるのが妥当でしょう

http://wikipedia.simpleapi.net/api?keyword=%E3%82%A2%E3%83%A9%E3%83%96%E7%A8%AE&output=xml

管理者ブログの更新も止まってます
http://www.simpleapi.net/blog/

WebAPIの練習ということなので、
データが無ければ「無し」と表示するようにプログラムを書き換えるといいでしょう

<?php
$keyword="海軍兵学校卒業生一覧(日本)";
$keyword4url=urlencode($keyword);
$url="http://wikipedia.simpleapi.net/api?keyword=$keyword4url&output=xml";
libxml_use_internal_errors(true);
if($xml=simplexml_load_file($url)) {
    echo '<pre>';
    print_r($xml);
    echo '</pre>';
} else {
    echo $url;
    echo '<br />取得失敗';
}
libxml_use_internal_errors(false);

以下マニュアル
http://php.net/manual/ja/function.simplexml-load-file.php
http://www.php.net/manual/ja/function.libxml-use-internal-errors.php

他5件のコメントを見る
id:kohhi

これすごいです。
ありがとうございます。

2012/02/18 16:46:39
id:kohhi

大変参考になりました。
いただいたヒントで少し勉強してから再度質問を立て直します。

2012/02/20 20:23:41

その他の回答3件)

id:dyondyon No.1

回答回数1ベストアンサー獲得回数0

コードには間違いはないようです。
おそらくファイル自体のエンコードがUTF-8以外になっているのだと思います。
TeraPadを使っているなら"ファイル"から"文字/改行コード指定保存"でUTF-8を選んで保存すればよいです。

id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

ポイント100pt

wikipedia.simpleapi.net/ はデータが古いので、ご質問にあるような新しく登録した語彙には対応していません。

「Wikipedia API(検索&パース)を作りました」が参考になります。
http://www.zubapita.jp/2009/03/30/wikipedia_search_api/

他2件のコメントを見る
id:kohhi

とりあえず、DB定義しないと使えないみたいです。
少しやってみて、質問を立て直します。
その際もよろしくお願いします。

2012/02/17 12:27:39
id:kohhi

大変参考になりました。
いただいたヒントで少し勉強してから再度質問を立て直します。

2012/02/20 20:23:34
id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント100pt

parser error : Document is emptyとなりますし、
http://wikipedia.simpleapi.net/ で入力してみても、
ブラウザのアドレス欄にエンコード後のアドレスを直接入れてみてもダメですね

http://wikipedia.simpleapi.net/api?keyword=%E6%B5%B7%E8%BB%8D%E5%85%B5%E5%AD%A6%E6%A0%A1%E5%8D%92%E6%A5%AD%E7%94%9F%E4%B8%80%E8%A6%A7%28%E6%97%A5%E6%9C%AC%29&output=xml

アラブ種については出ますので、プログラムコードの問題でも、
ましてや文字コードの問題などでもなく、
サーバーサイドのデータ更新が滞っていると考えるのが妥当でしょう

http://wikipedia.simpleapi.net/api?keyword=%E3%82%A2%E3%83%A9%E3%83%96%E7%A8%AE&output=xml

管理者ブログの更新も止まってます
http://www.simpleapi.net/blog/

WebAPIの練習ということなので、
データが無ければ「無し」と表示するようにプログラムを書き換えるといいでしょう

<?php
$keyword="海軍兵学校卒業生一覧(日本)";
$keyword4url=urlencode($keyword);
$url="http://wikipedia.simpleapi.net/api?keyword=$keyword4url&output=xml";
libxml_use_internal_errors(true);
if($xml=simplexml_load_file($url)) {
    echo '<pre>';
    print_r($xml);
    echo '</pre>';
} else {
    echo $url;
    echo '<br />取得失敗';
}
libxml_use_internal_errors(false);

以下マニュアル
http://php.net/manual/ja/function.simplexml-load-file.php
http://www.php.net/manual/ja/function.libxml-use-internal-errors.php

他5件のコメントを見る
id:kohhi

これすごいです。
ありがとうございます。

2012/02/18 16:46:39
id:kohhi

大変参考になりました。
いただいたヒントで少し勉強してから再度質問を立て直します。

2012/02/20 20:23:41
id:Cherenkov No.4

回答回数1504ベストアンサー獲得回数493

ポイント100pt

wikipedia.simpleapi.netのサイト上から「海軍兵学校卒業生一覧_(日本)」を取得しようとして失敗するので単純にAPIの不備だと思います。(wikipedia.simpleapiってDB登録云々関係なくて、公式APIのラッパーじゃないの?)

以下のwikipedia apiを直接たたけばXMLを取得できます。(ブラウザで確認)

http://ja.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xml&titles=%E6%B5%B7%E8%BB%8D%E5%85%B5%E5%AD%A6%E6%A0%A1%E5%8D%92%E6%A5%AD%E7%94%9F%E4%B8%80%E8%A6%A7_%28%E6%97%A5%E6%9C%AC%29

simplexml_load_fileを使ったサンプルを書きたかったけどエラーで動かなかった。

参考
id:kohhi

早速お返事ありがとうございます。
API:Properties/ja
を勉強してみます。

2012/02/17 12:25:52
id:kohhi

大変参考になりました。
いただいたヒントで少し勉強してから再度質問を立て直します。

2012/02/20 20:23:47
  • id:tdoi
    ちょっとだけ試したのでコメントで。

    まず、ファイルのエンコーディングがUTF-8でもダメなので、エンコーディングの問題ではないかなと思います。
    次に括弧の問題かと思いましたが、「(秘)ひらめ筋」は取得できたのでこの問題でもないかなと。
    となると、アンダーバー(スペース)があやしいかなと思ったりしています。

    ただ、これはAPI側の不具合のような気がしています。
    僕が試した感じでは、問題なく取得できるキーワードであっても、数回に1回は結果が空になりました。
    また、「海軍兵学校卒業生一覧_(日本)」で試した際も、空のレスポンスの際と、<result/>というノードだけのXMLが返ってくる場合とがありました。

    ということで、少なくとも空のレスポンスになる件は、API側の不具合、もしくは、なんらかの制限に引っかかってるのかなと思います。

    その上で、「海軍兵学校卒業生一覧」とかで検索した場合でも、正常にデータを取得しても見つからないとのレスポンスになるので、スペースを含むタイトルのページに関しては何か不具合が残っているのではないかなと推測しています。
    実際、「(秘)ひら」とかで検索しても、正しく、「(秘)ひらめ筋」の結果が取得できるので、検索クエリの問題ではなく、Web API側の問題ではないかと推測しています。
  • id:tdoi
    oil999さんの回答を見て気付きましたが、単純に古いダンプデータを使ってるせいですね。
    最新の更新履歴をみて、「アイオーン」とかで比較してみましたが、古い版の情報でした。
    また、「海軍兵学校卒業生一覧_(日本)」が作成されたのは、2011年7月なので、当然、出てこないですね。
  • id:kohhi
    tdoi様
    質問者です。私の欲しいデータは、古いのがほとんどのようです。
    結局パーサー作らないといけないみたいですね。
    oil999が教えてくれたパーサー、どこまで使えるか確認中です。
    早速コメントいただき、ありがとうございます。

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

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

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

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