当前位置: 首页 > 知识库问答 >
问题:

如何从MediaWiki API获取主体图像?

海典
2023-03-14

您好,我正在使用Curl从维基百科获取信息,我只想接收关于主图像的信息,我不想接收一篇文章的所有图像。。例如如果我想获得有关英语的所有图像的信息(http://en.wikipedia.org/wiki/English_language)我应该转到以下URL:http://en.wikipedia.org/w/api.php?action=query

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

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

共有3个答案

马峻
2023-03-14

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

  • 文章中最大的图片。

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

http://en.wikipedia.org/w/api.php?action=parse

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

对于最后一个选项,您需要的是文章的源wiki文本,可以通过rvprop=Content通过rvprop=Content获得:

http://en.wikipedia.org/w/api.php?action=query

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

请记住MediaWiki自动规范化页面(和图像)名称的各种方式:最值得注意的是,下划线映射到空格,连续的空格折叠到单个空格,名称的第一个字母大写。如果您决定走这条路,这里有一些示例PHP代码,可以将文件名列表转换为regexp,该regexp应该与wiki文本中的任何文件名相匹配:

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

生成的regexp将是:

/(?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
陈翰林
2023-03-14

这就是我让它工作的方式。。。

$.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>
朱海超
2023-03-14

有消息了!(从2014年开始)
一个新的扩展,PageImages,是可用的,并且已经安装在维基媒体wiki上。

代替prop=图像,使用prop=pageImage,您将获得一个pageImage属性和一个

诚然,它不能保证提供最佳结果,但在您的示例(英语)中,它运行良好,只生成地理分布图,而不是所有的旗帜。

此外,OpenSearch API确实返回一个

 类似资料:
  • 问题内容: 我是Go的新手,但到目前为止,我非常喜欢它。 我有一个我不知道的问题。我正在将API从Node迁移到Go,并且有此日志必须捕获POST 原样 并将其保存到Postgresql数据库的type列中。 这意味着我不能使用或预定的任何东西。 POST是用body raw制作的,如下所示: 在Node + Hapi上非常简单: 然后我可以从访问JSON 。 我正在将Go与Echo一起使用,所以

  • 问题内容: 对于每个@Entity,我需要执行以下操作: 如果该实体不存在,则持久保存该实体,并知道其是否存在。尽管我意识到这不是继承关系,但我尝试使用Entity来实现@Entity。我可以使用什么类来引用每个JPA实体?我可以只创建一个接口/抽象类MyEntities并让它们全部继承,但是这样吗?我希望更少的代码。另外,我希望能够提取每个实体的主键,就像我在.getId()中尝试的那样。 问题

  • 我试图给我的界面一个新的功能,但我遇到了一些障碍。当鼠标移动时,我想放大JLabel上的图像。以下是我的JLabels的外观: 代码一直在继续。我想创建一个函数并将其添加到mouseListener中,这样所有的行为都将相同。我想实现这一点: 但是我不知道我可以使用这个,因为java说我需要图像来创建我的放大图像图标 如何从代码中检索用于打包JLabel的图像。任何帮助都将不胜感激。

  • 问题内容: 我使用以下代码将单元格渲染更改为显示图像而不是文本: 现在,我希望能够获取中的每一行的图像,以便将其保存在数据库中。我该怎么办? 问题答案: 我无法抗拒这样的例子

  • 问题内容: 如何从Uri获取Bitmap对象(如果我成功将其存储在 以在应用程序中使用它? 有谁知道如何实现这一目标? 问题答案: 这是正确的方法: 如果您需要加载非常大的图像,则以下代码会将其加载到图块中(避免大内存分配):

  • 我想得到openweathermap图标。https://openweathermap.org/weather-conditions和http://samples.openweathermap.org/data/2.5/weather?q=London,英国 非常感谢你。你的建议对我很重要