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

Car*_*los 5 php xml curl wikipedia-api mediawiki-api

您好我正在使用Curl从维基百科获取信息,我想只收到有关主要图像的信息,我不想收到文章的所有图像..例如..如果我想获得有关所有信息的信息英语图像(http://en.wikipedia.org/wiki/English_language)我应该访问以下URL:http: //en.wikipedia.org/w/api.php?action = query&title = 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" />
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 7

有消息!(自2014年起)
新的扩展程序PageImages可用,并且已经安装在维基媒体wiki上.

而不是prop=images,使用prop=pageimages,你将获得每个元素的pageimage属性和<thumbnail>子节点<page>.

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


此外,OpenSearch API会返回<image>其中的xml表示形式,但此API不能与列表一起使用,也不能与查询API结合使用.


Ilm*_*nen 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 数据库中的任何位置。)


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

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

请注意,信息框中的许多图像等都被指定为模板的参数[[Image:...]],因此仅解析语法会丢失其中的一些图像。更好的解决方案可能是通过(您可以在同一个查询中执行,如我上面所示)获取页面上使用的所有图像的列表,并在维基文本中prop=images查找它们的名称(带或不带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';
Run Code Online (Sandbox Code Playgroud)

例如,当给出列表时:

Anglospeak(800px)Countries.png
Anglospeak.svg
Circle frame.svg
Commons-logo.svg
Flag of Argentina.svg
Flag of Aruba.svg
Run Code Online (Sandbox Code Playgroud)

生成的正则表达式将是:

/(?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
Run Code Online (Sandbox Code Playgroud)