¿Existe una API de wikipedia limpia solo para recuperar el resumen del contenido?


150

Solo necesito recuperar el primer párrafo de una página de Wikipedia. El contenido debe tener formato html, listo para mostrarse en mis sitios web (por lo tanto, ¡NO HAY BBCODE o CÓDIGO especial WIKIPEDIA!)


2
Wikipedia no usa código BB, usa su propio código de marcado wiki.
svick

No funciona para todos los artículos de wikipedia. ro.wikipedia.org/w/…
dumitru

Respuestas:


205

¡Hay una manera de obtener toda la "sección de introducción" sin ningún análisis html! Similar a la respuesta de AnthonyS con un explaintextparámetro adicional , puede obtener el texto de la sección de introducción en texto plano.

Consulta

Obteniendo la introducción de Stack Overflow en texto plano:

https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=Stack%20Overflow

Respuesta JSON

(advertencias despojadas)

{
    "query": {
        "pages": {
            "21721040": {
                "pageid": 21721040,
                "ns": 0,
                "title": "Stack Overflow",
                "extract": "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky, as a more open alternative to earlier Q&A sites such as Experts Exchange. The name for the website was chosen by voting in April 2008 by readers of Coding Horror, Atwood's popular programming blog.\nIt features questions and answers on a wide range of topics in computer programming. The website serves as a platform for users to ask and answer questions, and, through membership and active participation, to vote questions and answers up or down and edit questions and answers in a fashion similar to a wiki or Digg. Users of Stack Overflow can earn reputation points and \"badges\"; for example, a person is awarded 10 reputation points for receiving an \"up\" vote on an answer given to a question, and can receive badges for their valued contributions, which represents a kind of gamification of the traditional Q&A site or forum. All user-generated content is licensed under a Creative Commons Attribute-ShareAlike license. Questions are closed in order to allow low quality questions to improve. Jeff Atwood stated in 2010 that duplicate questions are not seen as a problem but rather they constitute an advantage if such additional questions drive extra traffic to the site by multiplying relevant keyword hits in search engines.\nAs of April 2014, Stack Overflow has over 2,700,000 registered users and more than 7,100,000 questions. Based on the type of tags assigned to questions, the top eight most discussed topics on the site are: Java, JavaScript, C#, PHP, Android, jQuery, Python and HTML."
            }
        }
    }
}

Documentación: API: query / prop = extractos


Editar: agregado &redirects=1como se recomienda en los comentarios.


28
Es muy recomendable utilizar y redirecciones = 1 que automáticamente redirecciona al contenido de sinónimos
joecks

66
¿Cómo puedo obtener información de esta respuesta JSON si no sé el número de páginas? No puedo acceder a la matriz JSON que contiene "extracto"
Laurynas G

@LaurynasG Puede lanzar el objeto a una matriz y luego tomarlo de esta manera: $ extract = current ((array) $ json_query-> query-> pages) -> extract
MarcGuay

@LaurynasG, @MarcGuay También puede agregar ` indexpageids como parámetro a la URL para obtener una lista de pageids para una iteración más fácil.
Rami

Obtuve la salida json de la llamada wiki y luego convertí la json en la matriz $ data = json_decode ($ json, true). Luego trato de obtener el 'extracto' usando $extract = current((array)$data->query->pages)->extract;. pero "Aviso: Intentando obtener propiedad de no objeto" sigue apareciendo.
Shikhar Bansal

79

En realidad, hay un accesorio muy agradable llamado extractos que se puede usar con consultas diseñadas específicamente para este propósito. Los extractos le permiten obtener extractos de artículos (texto de artículo truncado). Hay un parámetro llamado exintro que se puede usar para recuperar el texto en la sección cero (sin recursos adicionales como imágenes o cuadros de información). También puede recuperar extractos con una granularidad más fina, como por un cierto número de caracteres ( intercambiadores ) o por un cierto número de oraciones ( exenciones )

Aquí hay una consulta de muestra http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow y el sandbox API http://en.wikipedia.org/wiki/ Especial: ApiSandbox # action = query & prop = extractos & format = json & exintro = & title = Stack% 20Overflow para experimentar más con esta consulta.

Tenga en cuenta que si desea el primer párrafo específicamente, aún necesita hacer un análisis adicional como se sugiere en la respuesta elegida. La diferencia aquí es que la respuesta devuelta por esta consulta es más corta que algunas de las otras consultas de API sugeridas porque no tiene activos adicionales como imágenes en la respuesta de API para analizar.


62

Desde 2017 Wikipedia proporciona una API REST con mejor almacenamiento en caché. En la documentación puede encontrar la siguiente API que se adapta perfectamente a su caso de uso. (tal como lo utiliza la nueva función Vistas previas de página )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow devuelve los siguientes datos que se pueden usar para mostrar un resumen con una miniatura pequeña:

{
  "type": "standard",
  "title": "Stack Overflow",
  "displaytitle": "Stack Overflow",
  "extract": "Stack Overflow is a question and answer site for professional and enthusiast programmers. It is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It features questions and answers on a wide range of topics in computer programming. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. The name for the website was chosen by voting in April 2008 by readers of Coding Horror, Atwood's popular programming blog.",
  "extract_html": "<p><b>Stack Overflow</b> is a question and answer site for professional and enthusiast programmers. It is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It features questions and answers on a wide range of topics in computer programming. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. The name for the website was chosen by voting in April 2008 by readers of <i>Coding Horror</i>, Atwood's popular programming blog.</p>",
  "namespace": {
    "id": 0,
    "text": ""
  },
  "wikibase_item": "Q549037",
  "titles": {
    "canonical": "Stack_Overflow",
    "normalized": "Stack Overflow",
    "display": "Stack Overflow"
  },
  "pageid": 21721040,
  "thumbnail": {
    "source": "https://upload.wikimedia.org/wikipedia/en/thumb/f/fa/Stack_Overflow_homepage%2C_Feb_2017.png/320px-Stack_Overflow_homepage%2C_Feb_2017.png",
    "width": 320,
    "height": 149
  },
  "originalimage": {
    "source": "https://upload.wikimedia.org/wikipedia/en/f/fa/Stack_Overflow_homepage%2C_Feb_2017.png",
    "width": 462,
    "height": 215
  },
  "lang": "en",
  "dir": "ltr",
  "revision": "902900099",
  "tid": "1a9cdbc0-949b-11e9-bf92-7cc0de1b4f72",
  "timestamp": "2019-06-22T03:09:01Z",
  "description": "website hosting questions and answers on a wide range of topics in computer programming",
  "content_urls": {
    "desktop": {
      "page": "https://en.wikipedia.org/wiki/Stack_Overflow",
      "revisions": "https://en.wikipedia.org/wiki/Stack_Overflow?action=history",
      "edit": "https://en.wikipedia.org/wiki/Stack_Overflow?action=edit",
      "talk": "https://en.wikipedia.org/wiki/Talk:Stack_Overflow"
    },
    "mobile": {
      "page": "https://en.m.wikipedia.org/wiki/Stack_Overflow",
      "revisions": "https://en.m.wikipedia.org/wiki/Special:History/Stack_Overflow",
      "edit": "https://en.m.wikipedia.org/wiki/Stack_Overflow?action=edit",
      "talk": "https://en.m.wikipedia.org/wiki/Talk:Stack_Overflow"
    }
  },
  "api_urls": {
    "summary": "https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow",
    "metadata": "https://en.wikipedia.org/api/rest_v1/page/metadata/Stack_Overflow",
    "references": "https://en.wikipedia.org/api/rest_v1/page/references/Stack_Overflow",
    "media": "https://en.wikipedia.org/api/rest_v1/page/media/Stack_Overflow",
    "edit_html": "https://en.wikipedia.org/api/rest_v1/page/html/Stack_Overflow",
    "talk_page_html": "https://en.wikipedia.org/api/rest_v1/page/html/Talk:Stack_Overflow"
  }
}

De manera predeterminada, sigue las redirecciones (para que /api/rest_v1/page/summary/StackOverflowtambién funcione), pero esto se puede deshabilitar con?redirect=false

Si necesita acceder a la API desde otro dominio, puede configurar el encabezado CORS con &origin=(por ejemplo &origin=*)

Actualización 2019: la API parece devolver más información útil sobre la página.


1
Esto también incluye "tipo", que es excelente si necesita saber si lo que buscó tiene una "desambiguación".
Jeel Shah

1
Recibo un error de CORS al intentar acceder a este enlace desde mi aplicación basada en Angular. ¿Alguien puede decirme cómo resolverlo?
Praveen Ojha

2
¿Es posible consultar también por una ID de wikidata? Tengo algunos datos json que extraje que parece "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""¿Podemos obtener el extracto ahora por el QID?
Sourav Chatterjee

1
¿Se puede usar para cargar el resumen de más de una página?
cheesus

¿Qué pidió @SouravChatterjee? ¿Se puede usar esta API para buscar por ID de página? Parece que no
Abhijit Sarkar

39

Este código le permite recuperar el contenido del primer párrafo de la página en texto sin formato.

Parte de esta respuesta proviene de aquí y, por lo tanto, de aquí . Consulte la documentación de la API de MediaWiki para obtener más información.

// action=parse: get parsed text
// page=Baseball: from the page Baseball
// format=json: in json format
// prop=text: send the text content of the article
// section=0: top content of the page

$url = 'http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Baseball&prop=text&section=0';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, "TestScript"); // required by wikipedia.org server; use YOUR user agent with YOUR contact information. (otherwise your IP might get blocked)
$c = curl_exec($ch);

$json = json_decode($c);

$content = $json->{'parse'}->{'text'}->{'*'}; // get the main text content of the query (it's parsed HTML)

// pattern for first match of a paragraph
$pattern = '#<p>(.*)</p>#Us'; // http://www.phpbuilder.com/board/showthread.php?t=10352690
if(preg_match($pattern, $content, $matches))
{
    // print $matches[0]; // content of the first paragraph (including wrapping <p> tag)
    print strip_tags($matches[1]); // Content of the first paragraph without the HTML tags.
}

Pero si busca "coral", el resultado será algo no requerido. ¿Hay alguna otra manera, por lo que sólo las etiquetas p con smmary pueden ser recogidos
Deepanshu Goyal

31

Sí hay. Por ejemplo, si desea obtener el contenido de la primera sección del artículo Desbordamiento de pila , utilice una consulta como esta:

http://en.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=Stack%20Overflow&rvprop=content&rvsection=0&rvparse

Las partes significan esto:

  • format=xml: Devuelve el formateador de resultados como XML. Otras opciones (como JSON) están disponibles. Esto no afecta el formato del contenido de la página en sí, solo el formato de datos adjunto.

  • action=query&prop=revisions: Obtenga información sobre las revisiones de la página. Como no especificamos qué revisión, se usa la última.

  • titles=Stack%20Overflow: Obtenga información sobre la página Stack Overflow. Es posible obtener el texto de más páginas de una vez, si separa sus nombres por |.

  • rvprop=content: Devuelve el contenido (o texto) de la revisión.

  • rvsection=0: Devuelve solo contenido de la sección 0.

  • rvparse: Devuelve el contenido analizado como HTML.

Tenga en cuenta que esto devuelve toda la primera sección, incluidas las notas de sombrero ("Para otros usos ..."), cuadros de información o imágenes.

Hay varias bibliotecas disponibles para varios idiomas que facilitan el trabajo con API, puede ser mejor para usted si usa una de ellas.


3
No quiero que se analice el contenido del anuncio HTML, solo quiero obtener el "texto sin formato" (ni el código de Wikipedia)
brilla el

1
La API no ofrece nada de eso. Y puedo entender por qué: porque desde la perspectiva de la API, no está claro qué debe contener exactamente este "texto sin formato". Por ejemplo, cómo debe representar tablas, ya sea para incluir "[cita requerida]", cuadros de navegación o descripciones de imágenes.
svick

2
Agregar &redirects=trueal final del enlace garantiza que llegue al artículo de destino, si existe.
eric.mitchell

14

Este es el código que estoy usando ahora para un sitio web que estoy haciendo que necesita obtener los párrafos principales / resumen / sección 0 de artículos de Wikipedia, y todo se hace dentro del navegador (javascript del lado del cliente) gracias a la magia. de JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Utiliza la API de Wikipedia para obtener los párrafos iniciales (llamados sección 0) en HTML de la siguiente manera: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Luego elimina el HTML y otros datos no deseados, proporcionándole una cadena limpia de un resumen del artículo, si lo desea puede, con un pequeño ajuste, obtener una etiqueta "p" html alrededor de los párrafos iniciales, pero en este momento solo hay una nueva línea personaje entre ellos.

Código:

var url = "http://en.wikipedia.org/wiki/Stack_Overflow";
var title = url.split("/").slice(4).join("/");

//Get Leading paragraphs (section 0)
$.getJSON("http://en.wikipedia.org/w/api.php?format=json&action=parse&page=" + title + "&prop=text&section=0&callback=?", function (data) {
    for (text in data.parse.text) {
        var text = data.parse.text[text].split("<p>");
        var pText = "";

        for (p in text) {
            //Remove html comment
            text[p] = text[p].split("<!--");
            if (text[p].length > 1) {
                text[p][0] = text[p][0].split(/\r\n|\r|\n/);
                text[p][0] = text[p][0][0];
                text[p][0] += "</p> ";
            }
            text[p] = text[p][0];

            //Construct a string from paragraphs
            if (text[p].indexOf("</p>") == text[p].length - 5) {
                var htmlStrip = text[p].replace(/<(?:.|\n)*?>/gm, '') //Remove HTML
                var splitNewline = htmlStrip.split(/\r\n|\r|\n/); //Split on newlines
                for (newline in splitNewline) {
                    if (splitNewline[newline].substring(0, 11) != "Cite error:") {
                        pText += splitNewline[newline];
                        pText += "\n";
                    }
                }
            }
        }
        pText = pText.substring(0, pText.length - 2); //Remove extra newline
        pText = pText.replace(/\[\d+\]/g, ""); //Remove reference tags (e.x. [1], [4], etc)
        document.getElementById('textarea').value = pText
        document.getElementById('div_text').textContent = pText
    }
});

¿Agrega esto al script del lado del cliente? Si es así, ¿no es eso XSS?
craig

Tiene muchos errores, prueba este enlace con tu script: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht

8

Esta url devolverá un resumen en formato xml.

http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString=Agra&MaxHits=1

He creado una función para buscar la descripción de una palabra clave de wikipedia.

function getDescription($keyword){
    $url='http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString='.urlencode($keyword).'&MaxHits=1';
    $xml=simplexml_load_file($url);
    return $xml->Result->Description;
}
echo getDescription('agra');

5

También puede obtener contenido como el primer pagagraph a través de DBPedia que toma contenido de Wikipedia y crea información estructurada a partir de él (RDF) y lo pone a disposición a través de una API. La API DBPedia es SPARQL (basada en RDF) pero genera JSON y es bastante fácil de ajustar.

Como ejemplo, aquí hay una biblioteca JS súper simple llamada WikipediaJS que puede extraer contenido estructurado que incluye un primer párrafo de resumen: http://okfnlabs.org/wikipediajs/

Puede leer más al respecto en esta publicación de blog: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

El código de la biblioteca JS se puede encontrar aquí: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Si solo está buscando el texto que luego puede dividir pero no desea utilizar la API, consulte en.wikipedia.org/w/index.php?title=Elephant&action=raw


"listo para mostrarse en mis sitios web (¡así que NO HAY BBCODE, o CÓDIGO especial WIKIPEDIA!)" Y este es exactamente el oppsite
azul mientras que el

1

Mi enfoque fue el siguiente (en PHP):

$url = "whatever_you_need"

$html = file_get_contents('https://en.wikipedia.org/w/api.php?action=opensearch&search='.$url);
$utf8html = html_entity_decode(preg_replace("/U\+([0-9A-F]{4})/", "&#x\\1;", $html), ENT_NOQUOTES, 'UTF-8');

$utf8html podría necesitar más limpieza, pero eso es básicamente todo.


Es mejor preguntar utf8 desde la API con & utf8 =
TomoMiha

1

Probé la solución de @Michael Rapadas y @ Krinkle, pero en mi caso tuve problemas para encontrar algunos artículos dependiendo de la capitalización. Como aquí:

https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&exsentences=1&explaintext=&titles=Led%20zeppelin

Tenga en cuenta que trunqué la respuesta con exsentences=1

Aparentemente, la "normalización del título" no funcionaba correctamente:

La normalización de títulos convierte los títulos de las páginas a su forma canónica. Esto significa poner en mayúscula el primer carácter, reemplazar los guiones bajos con espacios y cambiar el espacio de nombres a la forma localizada definida para esa wiki. La normalización del título se realiza automáticamente, independientemente de qué módulos de consulta se utilicen. Sin embargo, cualquier salto de línea final en los títulos de la página (\ n) causará un comportamiento extraño y deben eliminarse primero.

Sé que podría haber solucionado el problema de las mayúsculas fácilmente, pero también existía el inconveniente de tener que lanzar el objeto a una matriz.

Entonces, como realmente quería el primer párrafo de una búsqueda bien conocida y definida (sin riesgo de obtener información de otros artículos) lo hice así:

https://en.wikipedia.org/w/api.php?action=opensearch&search=led%20zeppelin&limit=1&format=json

Tenga en cuenta que en este caso hice el truncamiento con limit=1

De esta manera:

  1. Puedo acceder a los datos de respuesta muy fácilmente.
  2. La respuesta es bastante pequeña.

Pero tenemos que seguir siendo cuidadosos con la capitalización de nuestra búsqueda.

Más información: https://www.mediawiki.org/wiki/API:Opensearch

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.