2012-08-27 11 views
5

こんにちはCurlを使用してWikipediaから情報を取得していますが、プリンシパルイメージに関する情報のみを受け取っています。記事のすべてのイメージを受け取ることは望ましくありません。 たとえば、 私はこのURLに行くべき英語のすべての画像(http://en.wikipedia.org/wiki/English_language)についての情報を得る: http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&prop=images を私は人々がXMLで英語を話す国の旗を受け取る:MediaWiki APIからプリンシパルイメージを取得するにはどうすればよいですか?

<?xml version="1.0"?> <api> <query> 
    <normalized> 
     <n from="English_language" to="English language" /> 
    </normalized> 
    <pages> 
     <page pageid="8569916" ns="0" title="English language"> 
     <images> 
      <im ns="6" title="File:Anglospeak(800px)Countries.png" /> 
      <im ns="6" title="File:Anglospeak.svg" /> 
      <im ns="6" title="File:Circle frame.svg" /> 
      <im ns="6" title="File:Commons-logo.svg" /> 
      <im ns="6" title="File:Flag of Argentina.svg" /> 
      <im ns="6" title="File:Flag of Aruba.svg" /> 
      <im ns="6" title="File:Flag of Australia.svg" /> 
      <im ns="6" title="File:Flag of Bolivia.svg" /> 
      <im ns="6" title="File:Flag of Brazil.svg" /> 
      <im ns="6" title="File:Flag of Canada.svg" /> 

私は校長についての情報が欲しいです画像。

+1

は何の画像あなたが得ることを期待しない...私はそれが働いて得た方法ですか?これらは英語のwikiページに表示された画像ではありませんか? Wikiデータは "英語の言語"についてのイメージを識別する方法で構成されていませんが、http://dbpedia.org/のようなプロジェクトをチェックすることができます。 – Noam

答えて

1

が指摘している、Wikipediaの記事は本当に「主画像」としてそのようなものを持っていません最初の問題は、特定のページで使用されるさまざまなイメージの中から選択する方法を決定することです。選択基準には、次のものがあります。

  • 記事の中で一番大きな画像です。
  • 最初の画像は特定の最小寸法を超えています。 60 × 60ピクセル。
  • 最初の画像はテンプレートではなく、記事のソーステキストで直接参照されています。最初の2つのオプションについては

、あなたはこのように、action=parseを経由してページのレンダリングされたHTMLコードをフェッチし、コードでimgタグを見つけるために、HTMLパーサーを使用することをお勧めします:

http://en.wikipedia.org/w/api.php?action=parse&page=English_language&prop=text|images

(ページ上で使用されるように、あなただけの直接APIから、画像の大きさを得ることができない理由は、その情報が実際にMediaWikiのデータベース内の任意の場所に保存されていないということです。)

最後のオプションについては

、何がしたいことはrvprop=contentprop=revisionsを経由して利用できる、記事のソースウィキテキストです:

http://en.wikipedia.org/w/api.php?action=query&titles=English_language&prop=revisions|images&rvprop=content

infoboxesと、そのような中、多くの画像がパラメータとして指定されていることを注意テンプレートには、[[Image:...]]の構文解析だけではそれらのいくつかが欠けてしまいます。もっと良い解決策は、おそらく、ページ上で使用されているすべての画像のリストをprop=images(これは同じクエリで、上で示したように)で取得し、その名前を(Image:/File:の付いていてもなくても) wikitext。

MediaWikiがページ(および画像)名を自動的に正規化するさまざまな方法に注意してください。最も一般的には、アンダースコアは空白にマップされ、連続する空白は1つのスペースに縮小され、名前の最初の文字は大文字になります。あなたはこの道を行くことにした場合、ここウィキテキストにそれらのいずれかと一致する必要があります正規表現の中にファイル名のリストを変換するいくつかのサンプルのPHPコードは次のとおりです。たとえば

foreach ($names as &$name) { 
    $name = trim(preg_replace('/[_\s]+/u', ' ', $name)); 
    $name = preg_quote($name, '/'); 
    $name = preg_replace('/^(\\\\?.)/us', '(?i:$1)', $name); 
    $name = preg_replace('/\\\\? /u', '[_\s]+', $name); 
} 
$regexp = '/' . implode('|', $names) . '/u'; 

、リストが与えられたとき:

Anglospeak(800px)Countries.png 
Anglospeak.svg 
Circle frame.svg 
Commons-logo.svg 
Flag of Argentina.svg 
Flag of Aruba.svg 

生成された正規表現は次のようになります。

/(?i:A)nglospeak\(800px\)Countries\.png|(?i:A)nglospeak\.svg|(?i:C)ircle[_\s]+frame\.svg|(?i:C)ommons\-logo\.svg|(?i:F)lag[_\s]+of[_\s]+Argentina\.svg|(?i:F)lag[_\s]+of[_\s]+Aruba\.svg/u 
+0

WikiMedia APIを使用してWikipediaから「プリンシパルイメージ」を取得する方法があります。ソリューションについては、http://stackoverflow.com/a/43039946/1097123を参照してください。 – kimbaudi

0

あなたはimlimit parameterと記事の最初の画像にクエリを制限することができます。他の人のよう

http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&redirects&prop=images&imlimit=1

+0

ありがとう、しかし、私はどのようにしてプリンシパルイメージだけを得ることができますか?必ずしも最初の画像がウィキペディアのメイン画像であるとは限りません – Carlos

+1

記事の「主要な」画像はありません。そのような情報は存在せず、APIによって取得できません。 http://dbpedia.org/をチェックしてください。最初のものも使用してください。フラグや曖昧さ回避アイコンなどを手動で結果から除外することもできます。 – Bergi

6

ニュースがあります!
新しい拡張子PageImagesが利用可能で、既にウィキメディアウィキにインストールされています。

代わりのprop=imagesprop=pageimagesを使用して、あなたは、各<page>要素についてpageimage属性と<thumbnail>子ノードを取得します。

確かに、最良の結果が得られるとは限りませんが、例(English Language)はworks wellで、すべてのフラグではなく、地理的分布のマップのみが得られます。


はまた、OpenSearch APIはそれのXML表現で<image>を返していますが、このAPIは、リストで使用可能なものではなく、クエリAPIと組み合わせることはできません。

3

これは

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&format=json&callback=?", { 
    titles: "India", 
    prop: "pageimages", 
    pithumbsize: 150 
    }, 
    function(data) { 
    var source = ""; 
    var imageUrl = GetAttributeValue(data.query.pages); 
    if (imageUrl == "") { 
     $("#wiki").append("<div>No image found</div>"); 
    } else { 
     var img = "<img src=\"" + imageUrl + "\">" 
     $("#wiki").append(img); 
    } 
    } 
); 

function GetAttributeValue(data) { 
    var urli = ""; 
    for (var key in data) { 
    if (data[key].thumbnail != undefined) { 
     if (data[key].thumbnail.source != undefined) { 
     urli = data[key].thumbnail.source; 
     break; 
     } 
    } 
    } 
    return urli; 
} 



<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<html> 

<head></head> 

<body> 
    <div id="wiki"></div> 
</body> 

</html> 
関連する問題