2012-08-27 13 views
5

Hola, estoy usando Curl para obtener información de Wikipedia, y quiero recibir solo información sobre la imagen principal, no quiero recibir todas las imágenes de un artículo .. Por ejemplo .. Si quiero obtener información sobre todas las imágenes del idioma Inglés (http://en.wikipedia.org/wiki/English_language) debería ir a la siguiente dirección: http://en.wikipedia.org/w/api.php?action=query&titles=English_Language&prop=images pero recibo banderas de los países donde se habla Inglés en XML:¿Cómo puedo obtener la imagen principal de MediaWiki API?

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

que sólo quieren que la información sobre el director imagen.

+1

lo que las imágenes es lo que espera obtener? ¿No son estas las imágenes que aparecieron en la página wiki sobre el idioma inglés? Los datos de Wiki no están estructurados para identificar una imagen del "idioma inglés", pero puedes consultar proyectos como http://dbpedia.org/, que pueden ser útiles. – Noam

Respuesta

1

Como otros han señalado, los artículos de Wikipedia en realidad no tienen ninguna tal cosa como una "imagen principal" , entonces su primer problema será decidir cómo elegir entre las diferentes imágenes utilizadas en una página determinada. Algunos criterios de selección posibles podrían ser:

  • Imagen más grande en el artículo.
  • Primera imagen que supera algunas dimensiones mínimas específicas, p. 60 × 60 píxeles.
  • Primera imagen referenciada directamente en el texto fuente del artículo, en lugar de a través de una plantilla.

Para las dos primeras opciones, usted querrá a buscar el código HTML representado a través de la página action=parse y utilizar un analizador de HTML para encontrar los img etiquetas en el código, así:

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

(la razón por la que no se puede sólo obtener los tamaños de las imágenes, tal como se utiliza en la página, directamente desde la API es que esa información no se almacena en cualquier parte de la base de datos de MediaWiki.)


Para la última opción, lo que quiere es la wikitexto fuente del artículo, disponible a través de prop=revisions con rvprop=content:

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

Tenga en cuenta que muchas imágenes en infoboxes y de que se especifiquen como parámetros a una plantilla, por lo que solo el análisis de la sintaxis [[Image:...]] omitirá algunos de ellos. Una mejor solución es simplemente obtener la lista de todas las imágenes utilizadas en la página a través del prop=images (que puede hacer en la misma consulta, como mostré arriba) y buscar sus nombres (con o sin Image:/File: prefijo) en el wikitext.

Tenga en cuenta las diversas formas en que MediaWiki normaliza automáticamente los nombres de página (e imagen): sobre todo, guiones bajos se asignan a los espacios, los espacios consecutivos se desplomó a un solo espacio y la primera letra del nombre se capitaliza.Si decide seguir este camino, aquí hay algo de código PHP de muestra que convertirá una lista de nombres de archivo en una expresión regular que debe coincidir con cualquiera de ellos en wikitexto:

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'; 

Por ejemplo, cuando se les da la lista:

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

la expresión regular generada será:

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

Hay una manera de obtener la "imagen principal" de Wikipedia usando la API de WikiMedia. Por favor, consulte http://stackoverflow.com/a/43039946/1097123 para la solución. – kimbaudi

0
+0

Gracias, pero ¿cómo podría obtener solo la imagen principal? no siempre la primera imagen es la imagen principal en wikipedia – Carlos

+1

No hay una imagen de "solo principal" para un artículo, dicha información no existe y la API no puede obtenerla. Visite http://dbpedia.org/, pero afaik use también el primero. Puede excluir manualmente elementos como banderas o iconos de desambiguación de sus resultados. – Bergi

6

Hay noticias! (desde 2014)
Una nueva extensión, PageImages, está disponible y también se ha instalado ya en Wikimedia wikis.

En lugar de prop=images, utilice prop=pageimages, y obtendrá un atributo pageimage y un nodo <thumbnail> niño para cada elemento <page>.

Es cierto que no se garantiza que se obtengan los mejores resultados, pero en su ejemplo (English Language) es works well y solo arroja el mapa de la distribución geográfica, no todas las banderas.


Además, el OpenSearch API hace devolver un <image> en ella de representación XML, pero esta API no es utilizable con las listas y no se puede combinar con la API de consulta.

3

Así es como yo tengo trabajo ...

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