【问题标题】:How can I get the principal image from MediaWiki API?如何从 MediaWiki API 获取主图像?
【发布时间】:2012-08-22 06:57:06
【问题描述】:

您好,我正在使用 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" />

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

【问题讨论】:

  • 您希望获得哪些图像?这些不是出现在维基页面上的关于英语的图像吗? Wiki 数据的结构无法识别有关“英语语言”的图像,但您可以查看 dbpedia.org 之类的项目,这可能会有所帮助。

标签: php xml curl wikipedia-api mediawiki-api


【解决方案1】:

有消息了! (自 2014 年起)
一个新的扩展,PageImages,已经可用并且已经安装在 Wikimedia wiki 上。

使用prop=pageimages 代替prop=images,您将获得一个pageimage 属性和一个&lt;thumbnail&gt; 子节点用于每个&lt;page&gt; 元素。

诚然,不能保证提供最佳结果,但在您的示例 (English Language) 中,works well 只产生地理分布图,而不是所有标志。


另外,OpenSearch API 确实会在其 xml 表示中返回 &lt;image&gt;,但此 API 不能用于列表,也不能与 Query API 结合使用。

【讨论】:

    【解决方案2】:

    这就是我的工作方式......

    $.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>
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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


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

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

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

      请记住 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
      

      【讨论】:

      【解决方案4】:

      【讨论】:

      • 谢谢,但是我怎么才能只得到主图像呢?并不总是第一张图片是维基百科上的主要图片
      • 文章没有“唯一主体”图片,此类信息不存在且无法通过API获取。查看dbpedia.org,但也可以使用第一个。您可以手动从结果中排除标志或消歧图标等内容。
      【解决方案5】:

      重要附录

      Bergi's answer,上面,看起来超级棒,但我因为无法让它工作而大发雷霆。

      我需要在查询中包含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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        • 2015-09-05
        • 1970-01-01
        • 2017-02-16
        • 2014-09-08
        • 1970-01-01
        相关资源
        最近更新 更多