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!)
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!)
Réponses:
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 explaintext
paramètre supplémentaire , vous pouvez obtenir le texte de la section d'introduction en texte brut.
Obtenir l'intro de Stack Overflow en texte brut:
(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=1
comme recommandé dans les commentaires.
$extract = current((array)$data->query->pages)->extract;
. mais "Remarque: essayer d'obtenir la propriété d'un non-objet" continue d'arriver.
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.
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/StackOverflow
fonctionne é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.
"other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""
Pouvons-nous obtenir l'extrait maintenant par le QID?
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§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.
}
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:
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.
&redirects=true
à la fin du lien garantit que vous accédez à l'article de destination, s'il en existe un.
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§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
}
});
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');
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
Le abstract.xml.gz
vidage ressemble à celui que vous voulez.
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
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
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:
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:
Mais nous devons continuer à faire attention à la capitalisation de notre recherche.
Plus d'informations: https://www.mediawiki.org/wiki/API:Opensearch