Existe-t-il une API wikipedia propre uniquement pour récupérer le résumé du contenu?

150

J'ai juste besoin de récupérer le premier paragraphe d'une page Wikipedia. Le contenu doit être au format html, prêt à être affiché sur mes sites Web (donc PAS de BBCODE, ni de CODE spécial WIKIPEDIA!)

scintillait
la source
2
Wikipedia n'utilise pas de code BB, il utilise son propre code de balisage wiki.
svick
Cela ne fonctionne pas pour tous les articles de Wikipédia. ro.wikipedia.org/w/…
dumitru

Réponses:

205

Il existe un moyen d'obtenir l'intégralité de la "section d'introduction" sans aucune analyse html! Semblable à la réponse d'AnthonyS avec un explaintextparamètre supplémentaire , vous pouvez obtenir le texte de la section d'introduction en texte brut.

Requete

Obtenir l'intro de Stack Overflow en texte brut:

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

Réponse JSON

(avertissements supprimés)

{
    "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."
            }
        }
    }
}

Documentation: API: query / prop = extraits


Edit: Ajouté &redirects=1comme recommandé dans les commentaires.

Mike Rapadas
la source
28
Il est très recommandé d'utiliser & redirects = 1 qui redirige automatiquement vers le contenu des synonymes
joecks
6
Comment puis-je obtenir des informations de cette réponse JSON si je ne connais pas le nombre de pages. Je ne peux pas accéder au tableau JSON contenant "extrait"
Laurynas G
@LaurynasG Vous pouvez convertir l'objet en tableau puis le récupérer comme ceci: $ extract = current ((array) $ json_query-> query-> pages) -> extract
MarcGuay
@LaurynasG, @MarcGuay Vous pouvez également ajouter ` indexpageids comme paramètre à l'URL pour obtenir une liste de pageids pour une itération plus facile.
Rami
J'ai obtenu la sortie json de l'appel wiki, puis j'ai converti le json en tableau $ data = json_decode ($ json, true). Ensuite, j'essaye d'obtenir le «extrait» en utilisant $extract = current((array)$data->query->pages)->extract;. mais "Remarque: essayer d'obtenir la propriété d'un non-objet" continue d'arriver.
shikhar bansal
79

Il existe en fait un très bon accessoire appelé extraits qui peut être utilisé avec des requêtes spécialement conçues à cet effet. Les extraits vous permettent d'obtenir des extraits d'articles (texte d'article tronqué). Il existe un paramètre appelé exintro qui peut être utilisé pour récupérer le texte dans la section zéro (pas de ressources supplémentaires comme des images ou des infoboxes). Vous pouvez également récupérer des extraits avec une granularité plus fine comme par exemple par un certain nombre de caractères ( exchars ) ou par un certain nombre de phrases ( exsentences )

Voici un exemple de requête http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow et le sandbox de l' API http://en.wikipedia.org/wiki/ Spécial: ApiSandbox # action = query & prop = extraits & format = json & exintro = & title = Stack% 20Overflow pour expérimenter plus avec cette requête.

Veuillez noter que si vous voulez le premier paragraphe spécifiquement, vous devez encore effectuer une analyse supplémentaire, comme suggéré dans la réponse choisie. La différence ici est que la réponse renvoyée par cette requête est plus courte que certaines des autres requêtes d'API suggérées car vous n'avez pas d'actifs supplémentaires tels que des images dans la réponse de l'API à analyser.

AnthonyS
la source
62

Depuis 2017, Wikipedia fournit une API REST avec une meilleure mise en cache. Dans la documentation, vous pouvez trouver l'API suivante qui correspond parfaitement à votre cas d'utilisation. (tel qu'il est utilisé par la nouvelle fonctionnalité d' aperçu de page )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow renvoie les données suivantes qui peuvent être utilisées pour afficher un résumé avec une petite vignette:

{
  "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"
  }
}

Par défaut, il suit les redirections (ce qui /api/rest_v1/page/summary/StackOverflowfonctionne également), mais cela peut être désactivé avec?redirect=false

Si vous avez besoin d'accéder à l'API depuis un autre domaine, vous pouvez définir l'en-tête CORS avec &origin=(par exemple &origin=*)

Mise à jour 2019: l'API semble renvoyer des informations plus utiles sur la page.

lw1.at
la source
1
Cela inclut également le "type" qui est excellent si vous avez besoin de savoir si ce que vous avez recherché a une "homonymie".
Jeel Shah
1
J'obtiens une erreur CORS en essayant d'accéder à ce lien à partir de mon application basée sur Angular, quelqu'un peut-il me dire comment résoudre cela.
Praveen Ojha
2
Est-il possible d'interroger également par un identifiant wikidata? J'ai des données json que j'ai extraites qui ressemblent à "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Pouvons-nous obtenir l'extrait maintenant par le QID?
Sourav Chatterjee
1
Cela peut-il être utilisé pour charger le résumé de plus d'une page?
cheesus
Qu'est-ce que @SouravChatterjee a demandé, cette API peut-elle être utilisée pour rechercher par identifiants de page? Semble pas
Abhijit Sarkar
39

Ce code vous permet de récupérer le contenu du premier paragraphe de la page en texte brut.

Certaines parties de cette réponse viennent d' ici et donc d' ici . Consultez la documentation de l'API MediaWiki pour plus d'informations.

// 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.
}
Vaillancourt
la source
Mais si vous recherchez "corail", le résultat ne sera pas obligatoire. Existe-t-il un autre moyen, de sorte que seules les balises p avec smmary puissent être récupérées
Deepanshu Goyal
31

Oui il y a. Par exemple, si vous souhaitez obtenir le contenu de la première section de l'article Stack Overflow , utilisez une requête comme celle-ci:

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

Les parties signifient ceci:

  • format=xml: Renvoie le formateur de résultats au format XML. D'autres options (comme JSON) sont disponibles. Cela n'affecte pas le format du contenu de la page lui-même, uniquement le format des données englobantes.

  • action=query&prop=revisions: Obtenez des informations sur les révisions de la page. Puisque nous ne spécifions pas quelle révision, la dernière est utilisée.

  • titles=Stack%20Overflow: Obtenir des informations sur la page Stack Overflow. Il est possible d'obtenir le texte de plusieurs pages en une seule fois, si vous séparez leurs noms par |.

  • rvprop=content: Renvoie le contenu (ou le texte) de la révision.

  • rvsection=0: Renvoie uniquement le contenu de la section 0.

  • rvparse: Renvoie le contenu analysé au format HTML.

Gardez à l'esprit que cela renvoie toute la première section, y compris des éléments tels que des notes à chapeau («Pour d'autres utilisations…»), des infoboxes ou des images.

Il existe plusieurs bibliothèques disponibles pour différents langages qui facilitent le travail avec l'API, il peut être préférable pour vous d'utiliser l'une d'entre elles.

svick
la source
3
Je ne veux pas que le contenu soit analysé en HTML, je veux juste obtenir le "texte brut" (ni le code wikipedia)
sparkle
1
L'API n'offre rien de tel. Et je peux comprendre pourquoi: parce que du point de vue de l'API, on ne sait pas exactement ce que doit contenir ce "texte brut". Par exemple, comment devrait-il représenter des tableaux, s'il faut inclure «[citation nécessaire]», des boîtes de navigation ou des descriptions d'images.
svick
2
L'ajout &redirects=trueà la fin du lien garantit que vous accédez à l'article de destination, s'il en existe un.
eric.mitchell
14

C'est le code que j'utilise actuellement pour un site Web que je crée qui doit obtenir les principaux paragraphes / résumé / section 0 des articles hors Wikipédia, et tout est fait dans le navigateur (javascript côté client) grâce à la magie de JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Il utilise l'API Wikipedia pour obtenir les principaux paragraphes (appelés section 0) en HTML comme ceci: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Il supprime ensuite le HTML et d'autres données indésirables, vous donnant une chaîne propre d'un résumé d'article, si vous le souhaitez, vous pouvez, avec un peu d'ajustement, obtenir une balise html "p" autour des premiers paragraphes, mais pour le moment, il n'y a qu'une nouvelle ligne caractère entre eux.

Code:

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
    }
});
01AutoMonkey
la source
L'ajoutez-vous au script côté client? Si oui, n'est-ce pas XSS?
craig
Il a beaucoup de bugs, essayez ce lien avec votre script: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht
8

Cette URL renverra un résumé au format xml.

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

J'ai créé une fonction pour récupérer la description d'un mot-clé 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');
Amit Garg
la source
5

Vous pouvez également obtenir du contenu tel que le premier pagagraph via DBPedia qui prend le contenu de Wikipedia et crée des informations structurées à partir de celui-ci (RDF) et le rend disponible via une API. L'API DBPedia est une API SPARQL (basée sur RDF) mais elle génère du JSON et il est assez facile à encapsuler.

À titre d'exemple, voici une bibliothèque JS super simple nommée WikipediaJS qui peut extraire un contenu structuré comprenant un premier paragraphe de résumé: http://okfnlabs.org/wikipediajs/

Vous pouvez en savoir plus à ce sujet dans cet article de blog: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

Le code de la bibliothèque JS peut être trouvé ici: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js

Rufus Pollock
la source
1

Si vous cherchez simplement le texte que vous pouvez ensuite diviser mais que vous ne voulez pas utiliser l'API, jetez un œil à en.wikipedia.org/w/index.php?title=Elephant&action=raw

mr.user1065741
la source
"prêt à être affiché sur mes sites Web (donc PAS de BBCODE, ni de code spécial WIKIPEDIA!)" Et c'est exactement l'oppsite
bleu pendant
1

Mon approche était la suivante (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 peut avoir besoin d'un nettoyage supplémentaire, mais c'est essentiellement tout

Alex
la source
Il est préférable de demander utf8 à l'API avec & utf8 =
TomoMiha
1

J'ai essayé la solution de @Michael Rapadas et @ Krinkle mais dans mon cas j'ai eu du mal à trouver des articles en fonction de la capitalisation. Comme ici:

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

Remarque j'ai tronqué la réponse avec exsentences=1

Apparemment, la "normalisation du titre" ne fonctionnait pas correctement:

La normalisation des titres convertit les titres de page en leur forme canonique. Cela signifie mettre en majuscule le premier caractère, remplacer les traits de soulignement par des espaces et remplacer l'espace de noms par la forme localisée définie pour ce wiki. La normalisation des titres est effectuée automatiquement, quels que soient les modules de requête utilisés. Cependant, tout saut de ligne de fin dans les titres de page (\ n) entraînera un comportement étrange et doit être supprimé en premier.

Je sais que j'aurais pu régler facilement le problème de la capitalisation, mais il y avait aussi l'inconvénient de devoir convertir l'objet en tableau.

Donc, parce que je voulais vraiment le tout premier paragraphe d'une recherche bien connue et définie (aucun risque de récupérer des informations à partir d'un autre article), je l'ai fait comme ceci:

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

Notez que dans ce cas j'ai fait la troncature avec limit=1

Par ici:

  1. Je peux accéder aux données de réponse très facilement.
  2. La réponse est assez petite.

Mais nous devons continuer à faire attention à la capitalisation de notre recherche.

Plus d'informations: https://www.mediawiki.org/wiki/API:Opensearch

Horloger
la source