你好,我正在使用Curl从维基百科获取信息,我只想接收关于主体图像的信息,我不想接收一篇文章的所有图像。例如..如果我想获取有关英语(http://en.wikipedia.org/wiki/English_language)的所有图像的信息,我应该访问这个网址:http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&prop=images,但我收到的是人们使用英语的国家的标志:
<?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" />我只需要关于主体图像的信息。
发布于 2012-08-29 06:26:48
正如其他人所指出的那样,维基百科的文章并没有真正的“主图像”,所以你的第一个问题将是如何在给定页面上使用的不同图像之间做出选择。一些可能的选择标准可能是:
对于前两个选项,您需要通过action=parse获取页面呈现的HTML代码,并使用HTML解析器在代码中查找img标记,如下所示:
http://en.wikipedia.org/w/api.php?action=parse&page=English_language&prop=text|images
(不能直接从API获取页面上使用的图像大小的原因是,这些信息实际上并没有存储在MediaWiki数据库中的任何地方。)
对于最后一个选项,您需要的是文章的源wikitext,可以通过prop=revisions和rvprop=content获得
http://en.wikipedia.org/w/api.php?action=query&titles=English_language&prop=revisions|images&rvprop=content
请注意,infoboxes中的许多图像都被指定为模板的参数,因此仅解析[[Image:...]]语法将会遗漏其中的一些图像。更好的解决方案可能是通过prop=images获取页面上使用的所有图像的列表(您可以在相同的查询中这样做,如上所述),然后在wikitext中查找它们的名称(带或不带Image: / File:前缀)。
请记住MediaWiki自动规范化页面(和图像)名称的各种方式:最值得注意的是,下划线映射到空格,连续的空格折叠为一个空格,名称的第一个字母大写。如果您决定这样做,下面是一些示例PHP代码,它们将把一个文件名列表转换为一个regexp,它应该与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生成的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发布于 2015-01-12 19:20:57
我就是这么让它工作的.
$.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>发布于 2012-08-28 03:05:25
您可以使用imlimit parameter将查询限制为文章中的第一个图像
http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&redirects&prop=images&imlimit=1
https://stackoverflow.com/questions/12147886
复制相似问题