2012-08-27 1 views
5

Bonjour J'utilise Curl pour obtenir des informations de Wikipedia, et je veux recevoir uniquement des informations sur l'image principale, je ne veux pas recevoir toutes les images d'un article .. Par exemple .. Si je veux obtenir des informations sur toutes les images de la langue anglaise (http://en.wikipedia.org/wiki/English_language) Je devrais aller à l'adresse suivante: http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&prop=images mais je reçois des drapeaux des pays où les gens parlent anglais en XML:Comment puis-je obtenir l'image principale de l'API MediaWiki?

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

Je veux que les informations sur le principal image.

+1

quelles images vous attendez-vous à obtenir? Ne sont-ce pas les images qui sont apparues dans la page wiki sur la langue anglaise? Les données Wiki ne sont pas structurées de manière à identifier une image sur la "langue anglaise" mais vous pouvez consulter des projets comme http://dbpedia.org/ qui pourraient vous aider. – Noam

Répondre

1

Comme d'autres l'ont noté, les articles de Wikipedia n'ont pas vraiment une telle chose comme une « image principale » , donc votre premier problème sera de décider comment choisir entre les différentes images utilisées sur une page donnée. Certains critères de sélection possibles peuvent être:

  • La plus grande image de l'article.
  • La première image dépasse certaines dimensions minimales spécifiques, par ex. 60 × 60 pixels.
  • Première image référencée directement dans le texte source de l'article plutôt que dans un modèle.

Pour les deux premières options, vous aurez envie de chercher le code HTML rendu de la page via action=parse et utiliser un analyseur HTML pour trouver les img balises dans le code, comme ceci:

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

(la raison pour laquelle vous ne pouvez pas obtenir les tailles des images, tel qu'il est utilisé sur la page, directement à partir de l'API est que ces informations ne sont pas réellement stockées partout dans la base de données MediaWiki.)


Pour la dernière option, ce que vous voulez est le wikitext source de l'article, disponible via prop=revisions avec rvprop=content:

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

Notez que de nombreuses images dans infoboxes et tels sont spécifiés comme paramètres à un modèle, donc l'analyse juste pour la syntaxe [[Image:...]] manquera certains d'entre eux. Une meilleure solution est probablement d'obtenir la liste de toutes les images utilisées sur la page via prop=images (que vous pouvez faire dans la même requête, comme je l'ai montré ci-dessus) et chercher leurs noms (avec ou sans préfixe Image:/File:) dans le wikitext. Gardez à l'esprit les différentes façons dont MediaWiki normalise automatiquement les noms de page (et d'image): notamment, les traits de soulignement sont mappés sur des espaces, les espaces consécutifs sont réduits à un seul espace et la première lettre du nom est en majuscule.Si vous décidez d'aller dans cette voie, voici quelques exemples de code PHP qui convertit une liste de noms de fichiers dans une expression rationnelle qui doit correspondre à l'un d'eux dans 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'; 

Par exemple, lorsque donné la liste:

Anglospeak(800px)Countries.png 
Anglospeak.svg 
Circle frame.svg 
Commons-logo.svg 
Flag of Argentina.svg 
Flag of Aruba.svg 

l'expression rationnelle générée sera:

/(?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 
+0

Il existe un moyen d'obtenir l '"image principale" de Wikipedia en utilisant l'API WikiMedia. S'il vous plaît voir http://stackoverflow.com/a/43039946/1097123 pour la solution. – kimbaudi

0

Vous pouvez limiter votre requête à la première image dans l'article avec le imlimit parameter:

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

+0

Merci, mais comment pourrais-je obtenir seulement l'image principale? pas toujours la première image est l'image principale sur wikipedia – Carlos

+1

Il n'y a pas d'image "seule principale" pour un article, de telles informations n'existent pas et ne peuvent pas être obtenues par l'API. Consultez http://dbpedia.org/, mais aussi l'utilisation du premier. Vous pouvez exclure manuellement des éléments tels que des indicateurs ou des icônes d'homonymie de vos résultats. – Bergi

6

Il y a des nouvelles! (à partir de 2014)
Une nouvelle extension, PageImages, est disponible et également déjà installée sur les wikis Wikimedia.

Au lieu de prop=images, utilisez prop=pageimages, et vous obtiendrez un attribut pageimage et un nœud enfant <thumbnail> pour chaque élément <page>.

Certes, ce n'est pas garanti de donner les meilleurs résultats, mais dans votre exemple (English Language) il works well et ne donne que la carte de la répartition géographique, tous les drapeaux.


En outre, le OpenSearch API ne retourne un <image> dans sa représentation xml, mais cette API n'est pas utilisable avec les listes et ne peuvent pas être avec l'API combiner requête.

3

Voilà comment je l'ai eu à travailler ...

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