-->

我怎样才能从链接到MediaWiki API的主要形象?(How can I get the pri

2019-07-31 05:00发布

你好,我使用curl从维基百科获取信息,我希望收到有关的主要图像仅供参考,我不希望收到的文章的所有图像。例如..如果我想获得的信息有关的所有英语语言(的图像http://en.wikipedia.org/wiki/English_language )我应该去这个网址: http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&prop=images但我收到人们在XML讲英语的国家的国旗:

<?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" />

我只是想了解的主要图像信息。

Answer 1:

正如其他人指出,维基百科的文章真的没有任何这样的事情作为一个“主形象”,所以你的第一个问题将决定如何在给定页面上使用的不同的图像之间进行选择。 一些可能的选择标准可能是:

  • 在文章中最大的图像。
  • 第一图像超过某个特定的最小尺寸,例如60×60像素。
  • 第一张图片中的文章的原文直接引用的,而不是通过一个模板。

对于前两个选项,你会希望获取通过页面的渲染HTML代码action=parse和使用HTML解析器能够找出img代码标签,就像这样:

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

(原因你不能只让图像的大小,页面上所使用的,直接从API是这些信息实际上并不存储任何地方在MediaWiki的数据库中。)


对于最后一个选项,你想要的是文章的来源wikitext的,通过使用prop=revisionsrvprop=content

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

注意InfoBoxes到许多图像和等被指定为参数模板,所以只用于解析[[Image:...]]语法将错过其中的一些。 更好的解决方案可能是刚刚获得通过的页面上使用的所有图像的列表prop=images (您可以在相同的查询做,正如我上面显示),并寻求他们的名字(有或无Image: / File:前缀)在wiki文字。

请记住在链接到MediaWiki自动恢复正常页面(和图像)名称的各种方法:最值得注意的是,下划线被映射到空间,连续的空格被压缩成一个空间和名称的第一个字母大写。 如果你决定走这条路,这里的一些示例PHP代码,将文件名列表转换成一个正则表达式应该匹配wikitext的任何一个:

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


Answer 2:

有消息! (从2014)
一个新的扩展, PageImages ,可也得到了已经安装在维基百科维基。

取而代之的prop=images ,使用prop=pageimages ,你会得到一个pageimage属性和<thumbnail>对于每个子节点<page>元素。

诚然,它不能保证提供最好的结果,但在你的例子( 英语 ),它工作得很好 ,只产生了地理分布的图,不是所有的标志。


此外, OpenSearch的API确实返回<image>在它的xml表示,但这个API不与列表可用,并且可以不与查询API被结合起来。



Answer 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>


Answer 4:

你可以限制你的查询与文章中的第一个图像imlimit参数 :

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



Answer 5:

重要的补遗

BERGI的答案 ,上面似乎超极,但我扑我的头,因为我无法得到它的工作。

我需要包括pilicense=any在我的查询,否则任何受版权保护的图像被忽略。

下面是我最终得到了工作查询:

https://en.wikipedia.org/w/api.php?action=query&pilicense=any&format=jsonfm&prop=pageimages&generator=search&gsrsearch=My+incategory:English-language_films+prefix:My&gsrlimit=3

我知道它已经一段时间,但是这是我登陆了,当我开始我的日子长了如何做到这一点搜索的第一页中的一个,所以我想分享这个具体这个页面上,为别人像我这样谁可能来这里。



文章来源: How can I get the principal image from MediaWiki API?