software - wikipedia api python
¿Hay una API de wikipedia limpia solo para recuperar el resumen de contenido? (12)
Necesito solo recuperar el primer párrafo de una página de Wikipedia. El contenido debe estar html formateado, listo para mostrarse en mis sitios web (¡así que NO BBCODE, o el CÓDIGO especial de WIKIPEDIA!)
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. (como lo usa la nueva característica de 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 veraniego con una pequeña miniatura:
{
"title": "",
"displaytitle": "",
"pageid": 21721040,
"extract": " is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. [...]",
"extract_html": "<p><b></b> is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. [...]",
"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",
"timestamp": "2018-01-30T09:21:21Z",
"description": "website hosting questions and answers on a wide range of topics in computer programming"
}
De forma predeterminada, sigue redirecciones (por lo que /api/rest_v1/page/summary/
también funciona), pero esto se puede deshabilitar con ?redirect=false
El volcado de abstract.xml.gz
suena como el que quieres.
En realidad, hay una propina muy bonita llamada extracts que se puede utilizar con consultas diseñadas específicamente para este propósito. Los extractos le permiten obtener extractos de artículos (texto truncado del artículo). Hay un parámetro llamado exintro que se puede usar para recuperar el texto en la sección zeroth (sin recursos adicionales, como imágenes o cuadros de información). También puede recuperar extractos con granularidad más fina, como por un cierto número de caracteres ( exchars ) o por un cierto número de oraciones ( exsentences )
Aquí hay una consulta de ejemplo http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow y la API sandbox http://en.wikipedia.org/wiki/Special:ApiSandbox#action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow para experimentar más con esta consulta.
Tenga en cuenta que si desea específicamente el primer párrafo, debe realizar 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 api sugeridas porque no tiene activos adicionales como imágenes en la respuesta de la API para analizar.
Esta url devolverá el resumen en formato xml.
http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString=Agra&MaxHits=1
Creé una función para obtener 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'');
Este código le permite recuperar el contenido del primer párrafo de la página en texto sin formato.
Partes de esta respuesta vienen de here y por lo tanto here . Vea la documentación de MediaWiki API para 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§ion=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.
}
Este es el código que estoy usando en este momento para un sitio web que estoy haciendo que necesita para 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 principales (llamada sección 0) en HTML, como por ejemplo: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?
Luego borra el HTML y otros datos no deseados, brindándole una cadena limpia de un resumen del artículo, si lo desea puede, con un pequeño ajuste, obtener una etiqueta html "p" alrededor de los párrafos principales, 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§ion=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
}
});
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.
Probé la solución de @Michael Rapadas y @ Krinkle, pero en mi caso tuve problemas para encontrar algunos artículos en función de las mayúsculas y minúsculas. Como aquí:
Tenga en cuenta que exsentences=1
la respuesta con exsentences=1
Aparentemente, la "normalización del título" no funcionaba correctamente:
La normalización del título convierte los títulos de las páginas a su forma canónica. Esto significa capitalizar el primer carácter, reemplazar 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 usen. Sin embargo, cualquier salto de línea final en los títulos de página (/ n) causará un comportamiento extraño y se deben eliminar primero.
Sé que pude haber resuelto el problema de la capitalización fácilmente, pero también tuve la inconveniencia 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:
- Puedo acceder a los datos de respuesta muy fácilmente.
- La respuesta es bastante pequeña.
Pero debemos seguir siendo cuidadosos con la capitalización de nuestra búsqueda.
Más información: https://www.mediawiki.org/wiki/API:Opensearch
Sí hay. Por ejemplo, si desea obtener el contenido de la primera sección del artículo Desbordamiento de pila , use una consulta como esta:
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 utiliza la última.titles=Stack%20Overflow
:titles=Stack%20Overflow
información sobre la página. 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 el contenido de la sección 0.rvparse
: devuelve el contenido analizado como HTML.
Tenga en cuenta que esto devuelve toda la primera sección incluyendo cosas como hatnotes ("Para otros usos ..."), infoboxes o imágenes.
Hay varias bibliotecas disponibles para varios idiomas que hacen que trabajar con API sea más fácil, puede ser mejor para usted si utilizó una de ellas.
Si solo está buscando el texto que puede dividir pero no desea usar la API, eche un vistazo a en.wikipedia.org/w/index.php?title=Elephant&action=raw
También puede obtener contenido como el primer pesegraph a través de DBPedia que toma el contenido de Wikipedia y crea información estructurada a partir de él (RDF) y lo hace disponible a través de una API. La API de DBPedia es SPARQL (basada en RDF) pero genera JSON y es muy fácil de envolver.
Como ejemplo, aquí hay una biblioteca JS super simple llamada WikipediaJS que puede extraer contenido estructurado que incluye un primer párrafo de resumen: http://okfnlabs.org/wikipediajs/
Puedes leer más sobre esto 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
¡Hay una manera de obtener toda la "sección de introducción" sin ningún análisis html! De forma similar a la answer de AnthonyS con un param de explaintext
adicional, puede obtener el texto de la sección de introducción en texto sin formato.
Consulta
Obtener la introducción de en texto sin formato:
Respuesta JSON
(advertencias despojadas)
{
"query": {
"pages": {
"21721040": {
"pageid": 21721040,
"ns": 0,
"title": "",
"extract": " 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 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, 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