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!)
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!)
Risposte:
C'è un modo per ottenere l'intera "sezione introduttiva" senza analisi HTML! Simile alla risposta di AnthonyS con un explaintext
parametro aggiuntivo , è possibile ottenere il testo della sezione introduttiva in testo semplice.
Ottenere l'introduzione di Stack Overflow in testo semplice:
(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=1
come raccomandato nei commenti.
$extract = current((array)$data->query->pages)->extract;
. ma "Avviso: cercare di ottenere proprietà di non oggetti" continua a venire.
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.
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/StackOverflow
anche), 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.
"other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""
possiamo ottenere l'estrazione ora dal QID?
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§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.
}
Si C'è. Ad esempio, se si desidera ottenere il contenuto della prima sezione dell'articolo Stack Overflow , utilizzare una query come questa:
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.
&redirects=true
alla fine del collegamento consente di accedere all'articolo di destinazione, se presente.
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§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
}
});
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');
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
La abstract.xml.gz
discarica suona come quella che desideri.
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
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.
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:
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:
Ma dobbiamo continuare a stare attenti alla capitalizzazione della nostra ricerca.
Maggiori informazioni: https://www.mediawiki.org/wiki/API:Opensearch