Esiste un'API di Wikipedia pulita solo per recuperare il riepilogo del contenuto?


150

Ho solo bisogno di recuperare il primo paragrafo di una pagina di Wikipedia. Il contenuto deve essere in formato html, pronto per essere visualizzato sui miei siti Web (quindi NESSUN CODICE speciale BBCODE o WIKIPEDIA!)


2
Wikipedia non usa il codice BB, usa il proprio codice markup wiki.
svick

Non funziona per ogni articolo di Wikipedia. ro.wikipedia.org/w/…
dumitru

Risposte:


205

C'è un modo per ottenere l'intera "sezione introduttiva" senza analisi HTML! Simile alla risposta di AnthonyS con un explaintextparametro aggiuntivo , è possibile ottenere il testo della sezione introduttiva in testo semplice.

domanda

Ottenere l'introduzione di Stack Overflow in testo semplice:

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

Risposta JSON

(avvertenze rimosse)

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

Documentazione: API: query / prop = extract


Modifica: aggiunto &redirects=1come raccomandato nei commenti.


28
Si consiglia vivamente di utilizzare & reindirizzamenti = 1 che reindirizza automaticamente al contenuto dei sinonimi
Joecks,

6
Come posso ottenere informazioni da questa risposta JSON se non conosco il numero di pagine. Non riesco ad accedere all'array JSON contenente "extract"
Laurynas G

@LaurynasG Puoi lanciare l'oggetto su un array e poi afferrarlo in questo modo: $ extract = current ((array) $ json_query-> query-> pagine) -> extract
MarcGuay

@LaurynasG, @MarcGuay Puoi anche aggiungere ` indexpageids come parametro all'URL per ottenere un elenco di pageids per una iterazione più semplice.
Rami,

Ho ottenuto l'output json dalla chiamata wiki e quindi ho lanciato il json nell'array $ data = json_decode ($ json, true). Quindi provo a ottenere l''estrazione 'usando $extract = current((array)$data->query->pages)->extract;. ma "Avviso: cercare di ottenere proprietà di non oggetti" continua a venire.
shikhar bansal,

79

V'è in realtà un bel puntello chiamato estratti che possono essere utilizzati con le query progettate appositamente per questo scopo. Gli estratti consentono di ottenere estratti dell'articolo (testo dell'articolo troncato). Esiste un parametro chiamato exintro che può essere utilizzato per recuperare il testo nella sezione zeroth (nessuna risorsa aggiuntiva come immagini o caselle informative). Puoi anche recuperare estratti con granularità più fine, ad esempio un certo numero di caratteri ( exchars ) o un certo numero di frasi ( esenzioni )

Ecco una query di esempio http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow e la sandbox dell'API http://en.wikipedia.org/wiki/ Speciale: ApiSandbox # action = query & prop = extract & format = json & exintro = & titoli = Stack% 20 Overflow per sperimentare di più con questa query.

Si noti che se si desidera specificamente il primo paragrafo, è comunque necessario eseguire ulteriori analisi come suggerito nella risposta scelta. La differenza qui è che la risposta restituita da questa query è più breve di alcune delle altre query api suggerite perché non hai risorse aggiuntive come immagini nella risposta api da analizzare.


62

Dal 2017 Wikipedia fornisce un'API REST con una migliore memorizzazione nella cache. Nella documentazione puoi trovare la seguente API che si adatta perfettamente al tuo caso d'uso. (poiché viene utilizzato dalla nuova funzione Anteprime pagina )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow restituisce i seguenti dati che possono essere utilizzati per visualizzare un riepilogo con una piccola anteprima:

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

Per impostazione predefinita, segue i reindirizzamenti (in modo che funzioni /api/rest_v1/page/summary/StackOverflowanche), ma questo può essere disabilitato con?redirect=false

Se è necessario accedere all'API da un altro dominio, è possibile impostare l'intestazione CORS con &origin=(ad es. &origin=*)

Aggiornamento 2019: l'API sembra restituire informazioni più utili sulla pagina.


1
Questo include anche "tipo" che è eccellente se devi sapere se ciò che hai cercato ha una "disambiguazione".
Jeel Shah,

1
Ricevo un errore CORS mentre provo ad accedere a questo link dalla mia applicazione basata su Angular qualcuno può dirmi come risolverlo.
Praveen Ojha,

2
È anche possibile eseguire una query tramite un ID wikidata? Ho alcuni dati json che ho estratto che sembra che "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""possiamo ottenere l'estrazione ora dal QID?
Sourav Chatterjee,

1
Può essere usato per caricare il riepilogo di più di una pagina?
cheesus,

Cosa ha richiesto @SouravChatterjee, questa API può essere utilizzata per la ricerca per ID pagina? Non sembra
Abhijit Sarkar il

39

Questo codice consente di recuperare il contenuto del primo paragrafo della pagina in testo semplice.

Parti di questa risposta provengono da qui e quindi qui . Vedere la documentazione dell'API MediaWiki per ulteriori informazioni.

// 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.
}

Ma se cerchi "corallo", il risultato sarà qualcosa di non necessario. Esiste un altro modo, in modo che solo i tag p con smmary possano essere raccolti
Deepanshu Goyal,

31

Si C'è. Ad esempio, se si desidera ottenere il contenuto della prima sezione dell'articolo Stack Overflow , utilizzare una query come questa:

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

Le parti significano questo:

  • format=xml: Restituisce il formattatore del risultato come XML. Altre opzioni (come JSON) sono disponibili. Ciò non influisce sul formato del contenuto della pagina stessa, ma solo sul formato dei dati allegato.

  • action=query&prop=revisions: Ottieni informazioni sulle revisioni della pagina. Dal momento che non specifichiamo quale revisione, viene utilizzata l'ultima.

  • titles=Stack%20Overflow: Ottieni informazioni sulla pagina Stack Overflow. È possibile ottenere il testo di più pagine in una volta sola, se si separano i loro nomi da |.

  • rvprop=content: Restituisce il contenuto (o il testo) della revisione.

  • rvsection=0: Restituisce solo il contenuto della sezione 0.

  • rvparse: Restituisce il contenuto analizzato come HTML.

Tieni presente che questo restituisce l'intera prima sezione, inclusi elementi come le note ("Per altri usi ..."), caselle informative o immagini.

Esistono diverse librerie disponibili per varie lingue che semplificano il lavoro con l'API, potrebbe essere meglio se ne usi una.


3
Non voglio il contenuto analizzato in HTML, voglio solo ottenere il "testo semplice" (né codice wikipedia)
sparkle

1
L'API non offre nulla del genere. E capisco perché: dal punto di vista dell'API, non è chiaro cosa debba contenere esattamente questo "testo semplice". Ad esempio, come dovrebbe rappresentare le tabelle, se includere "[citazione necessaria]", caselle di navigazione o descrizioni di immagini.
svick,

2
L'aggiunta &redirects=truealla fine del collegamento consente di accedere all'articolo di destinazione, se presente.
eric.mitchell,

14

Questo è il codice che sto usando in questo momento per un sito Web che sto creando che deve ottenere i paragrafi / riepilogo / sezione 0 principali degli articoli di Wikipedia, ed è tutto fatto all'interno del browser (javascript lato client) grazie a Magick di JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Utilizza l'API di Wikipedia per ottenere i paragrafi principali (chiamati sezione 0) in HTML in questo modo: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Quindi rimuove l'HTML e altri dati indesiderati, dandoti una stringa pulita di un riepilogo dell'articolo, se vuoi puoi, con un po 'di modifica, ottenere un tag html "p" attorno ai paragrafi principali ma in questo momento c'è solo una nuova riga personaggio tra loro.

Codice:

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
    }
});

Lo aggiungi allo script lato client? Se è così, non è XSS?
Craig,

Ha molti bug, prova questo link con il tuo script: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht

8

Questo URL restituirà un riepilogo in formato xml.

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

Ho creato una funzione per recuperare la descrizione di una parola chiave da 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

Puoi anche ottenere contenuti come il primo paragrafo tramite DBPedia che prende contenuti di Wikipedia e crea informazioni strutturate da esso (RDF) e li rende disponibili tramite un'API. L'API DBPedia è SPARQL (basata su RDF) ma genera JSON ed è abbastanza facile da avvolgere.

Ad esempio, ecco una libreria JS super semplice chiamata WikipediaJS che può estrarre contenuti strutturati tra cui un primo paragrafo di riepilogo: http://okfnlabs.org/wikipediajs/

Puoi leggere di più a riguardo in questo post del blog: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

Il codice della libreria JS è disponibile qui: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Se stai solo cercando il testo che puoi dividere, ma non vuoi usare l'API, dai un'occhiata a en.wikipedia.org/w/index.php?title=Elephant&action=raw


"pronto per essere visualizzato sui miei siti Web (quindi NESSUN CODICE speciale BBCODE o WIKIPEDIA!)" E questo è esattamente l'opposto
bluewhile

1

Il mio approccio era il seguente (in 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 potrebbe aver bisogno di ulteriore pulizia, ma è praticamente tutto.


È meglio chiedere utf8 dall'API con & utf8 =
TomoMiha,

1

Ho provato @Michael Rapadas e la soluzione di @ Krinkle ma nel mio caso ho avuto difficoltà a trovare alcuni articoli a seconda della capitalizzazione. Come qui:

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

Nota ho troncato la risposta con exsentences=1

Apparentemente la "normalizzazione del titolo" non funzionava correttamente:

La normalizzazione del titolo converte i titoli delle pagine nella loro forma canonica. Questo significa capitalizzare il primo personaggio, sostituire i caratteri di sottolineatura con spazi e cambiare lo spazio dei nomi nella forma localizzata definita per quel wiki. La normalizzazione del titolo viene eseguita automaticamente, indipendentemente dai moduli di query utilizzati. Tuttavia, qualsiasi interruzione di riga finale nei titoli di pagina (\ n) provocherà comportamenti strani e dovrebbero essere eliminati per primi.

So che avrei potuto risolvere facilmente il problema della capitalizzazione, ma c'era anche l'inconveniente di dover lanciare l'oggetto su un array.

Quindi, poiché volevo solo il primo paragrafo di una ricerca ben nota e definita (nessun rischio di recuperare informazioni da altri articoli), l'ho fatto in questo modo:

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

Nota in questo caso ho fatto il troncamento con limit=1

Per di qua:

  1. Posso accedere ai dati di risposta molto facilmente.
  2. La risposta è piuttosto piccola.

Ma dobbiamo continuare a stare attenti alla capitalizzazione della nostra ricerca.

Maggiori informazioni: https://www.mediawiki.org/wiki/API:Opensearch

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.