5

您好,我正在使用 Curl 从 Wikipedia 获取信息,并且我只想接收有关主要图像的信息,我不想接收文章的所有图像.. 例如.. 如果我想获取有关所有图像的信息英语图片 ( http://en.wikipedia.org/wiki/English_language ) 我应该去这个 URL: 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" />

我只想要关于主图像的信息。

4

5 回答 5

7

有消息!(从 2014 年开始)
一个新的扩展程序PageImages可用,并且已经安装在 Wikimedia wiki 上。

代替prop=images, 使用prop=pageimages,您将获得每个元素的pageimage属性和子节点。<thumbnail><page>

诚然,它不能保证给出最好的结果,但在你的例子(英语)中它运作良好,只产生地理分布的地图,而不是所有的标志。


此外,OpenSearch API确实会<image>在其 xml 表示中返回一个,但此 API 不能用于列表,也不能与 Query API 结合使用。

于 2014-07-16T07:32:05.190 回答
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>
于 2015-01-12T11:20:57.430 回答
1

正如其他人所指出的,Wikipedia 文章实际上并没有“主要图像”之类的东西,因此您的第一个问题将是决定如何在给定页面上使用的不同图像之间进行选择。一些可能的选择标准可能是:

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

对于前两个选项,您需要通过获取页​​面呈现的 HTML 代码action=parse并使用 HTML 解析器来查找img代码中的标签,如下所示:

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

(您不能直接从 API 获取页面上使用的图像大小的原因是该信息实际上并未存储在 MediaWiki 数据库的任何位置。)


对于最后一个选项,您想要的是文章的源维基文本,可通过prop=revisionswith 获得rvprop=content

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

请注意,信息框等中的许多图像被指定为模板的参数,因此仅解析[[Image:...]]语法会丢失其中的一些。更好的解决方案可能是获取页面上使用的所有图像的列表prop=images(您可以在同一个查询中执行,如上所示)并在 wikitext 中查找它们的名称(带或不带Image:/前缀)。File:

请记住 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
于 2012-08-28T22:26:48.077 回答
0

您可以使用以下imlimit参数将查询限制为文章中的第一张图片:

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

于 2012-08-27T19:05:25.367 回答
0

重要附录

上面的 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

我知道已经有一段时间了,但这是我开始长达数天的搜索如何做到这一点时登陆的第一页之一,所以我想在这个页面上专门分享这个,为像我这样可能来这里的其他人.

于 2018-05-08T15:57:49.513 回答