web-dev-qa-db-fra.com

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

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!)

133
sparkle

Il existe un moyen d'obtenir la totalité de la "section d'introduction" sans aucune analyse HTML! Semblable à AnthonyS réponse avec un paramètre additionnel explaintext, 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 dépouillé)

{
    "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: requête/prop = extraits


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

185
Mike Rapadas

Il y a en fait un très gentil prop appelé extraits pouvant être utilisé avec des requêtes spécialement conçues à cet effet. Les extraits vous permettent d’obtenir des extraits d’article (texte d’article tronqué). Il existe un paramètre appelé exintro qui peut être utilisé pour extraire le texte de la section zéro (no actifs supplémentaires tels que des images ou des infoboxes). Vous pouvez également récupérer des extraits avec une granularité plus fine, 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 = & Titres = Stack% 20Overflow et le bac à sable API http://fr.wikipedia.org/wiki/Special:ApiSandbox # action = requête & prop = extraits & format = json & exintro = & titres = Pile% 20Overflow pour expérimenter davantage avec cette requête.

Veuillez noter que si vous souhaitez spécifiquement le premier paragraphe, vous devez encore procéder à une analyse syntaxique 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 ne disposez pas d'actifs supplémentaires tels que des images dans la réponse de l'API à analyser.

73
AnthonyS

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. (comme il est utilisé par la nouvelle prévisualisation de page )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow renvoie les données suivantes pouvant ê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 (pour que /api/rest_v1/page/summary/StackOverflow fonctionne également), mais cela peut être désactivé avec ?redirect=false.

Si vous devez 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.

46
lw1.at

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

Des parties de cette réponse proviennent de ici et donc ici . Voir 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.
}
39

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ésultat au format XML. D'autres options (comme JSON) sont disponibles. Cela n'affecte pas le format du contenu de la page, mais uniquement le format des données.

  • action=query&prop=revisions: Obtenir 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, en séparant 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.

N'oubliez pas que cela renvoie toute la première section, y compris des notes telles que des notes de chapeau ("Pour d'autres utilisations…"), des infoboxes ou des images.

Il existe plusieurs bibliothèques disponibles pour différentes langues qui facilitent l'utilisation de l'API; il peut être préférable pour vous d'utiliser l'une d'elles.

30
svick

C’est le code que j’utilise actuellement pour un site Web que je suis en train de créer et qui doit contenir les principaux paragraphes/résumé/section 0 des articles de Wikipedia, et tout cela est fait dans le navigateur (javascript côté client) grâce à la magick de JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

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

Il supprime ensuite le code HTML et les autres données non souhaitées, vous donnant ainsi une chaîne propre d’un résumé d’article. Si vous le souhaitez, vous pouvez, avec un petit ajustement, obtenir une balise html "p" autour des premiers paragraphes, mais il n’ya actuellement 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
    }
});
15
01AutoMonkey

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 permettant de récupérer la description d'un mot clé sur 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');
8
Amit Garg

Vous pouvez également obtenir un contenu tel que le premier paragraphe via DBPedia , qui récupère le contenu Wikipedia et en crée des informations structurées (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 est assez facile à boucler.

À titre d'exemple, voici une bibliothèque JS très simple nommée WikipediaJS qui peut extraire un contenu structuré, y compris un résumé, premier paragraphe: 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 est disponible ici: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js

5
Rufus Pollock

Le abstract.xml.gz dump ressemble à celui que vous voulez.

2
sarnold

J'ai essayé la solution @Michael Rapadas et @ Krinkle, mais dans mon cas, j'avais 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 implique de mettre le premier caractère en majuscule, de remplacer les caractères de soulignement par des espaces et de changer l'espace de nom en le formulaire localisé défini 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 dans les titres de page (\ n) provoquera un comportement étrange et ils doivent être supprimés en premier.

Je sais que j'aurais pu résoudre 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 vraiment le tout premier paragraphe d'une recherche bien connue et définie (aucun risque de récupérer des informations dans d'autres articles), je l'ai fait comme ceci:

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

Remarque 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'infos: https://www.mediawiki.org/wiki/API:Opensearch

1
gugol

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 pourrait avoir besoin d'un nettoyage supplémentaire, mais c'est tout.

1
Alex

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

0
mr.user1065741