Gibt es eine saubere Wikipedia-API nur zum Abrufen der Inhaltszusammenfassung?

150

Ich muss nur den ersten Absatz einer Wikipedia-Seite abrufen. Der Inhalt muss HTML-formatiert sein und auf meinen Websites angezeigt werden können (also KEIN BBCODE- oder WIKIPEDIA-Spezialcode!).

funkeln
quelle
2
Wikipedia verwendet keinen BB-Code, sondern einen eigenen Wiki-Markup-Code.
Svick
Es funktioniert nicht für jeden Wikipedia-Artikel. ro.wikipedia.org/w/…
dumitru

Antworten:

205

Es gibt eine Möglichkeit, den gesamten "Intro-Bereich" ohne HTML-Analyse abzurufen! Ähnlich wie bei der Antwort von AnthonyS mit einem zusätzlichen explaintextParameter können Sie den Text des Intro-Abschnitts im Klartext erhalten.

Abfrage

Das Intro von Stack Overflow im Klartext abrufen:

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

JSON-Antwort

(Warnungen entfernt)

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

Dokumentation: API: query / prop = Extrakte


Bearbeiten: &redirects=1Wie in den Kommentaren empfohlen hinzugefügt .

Mike Rapadas
quelle
28
Es ist sehr empfehlenswert, & redirects = 1 zu verwenden, das automatisch zum Inhalt von Synonymen
umleitet
6
Wie kann ich Informationen aus dieser JSON-Antwort erhalten, wenn ich die Seitenzahl nicht kenne? Ich kann nicht auf JSON-Array mit "Extrakt" zugreifen
Laurynas G
@LaurynasG Sie können das Objekt in ein Array umwandeln und dann wie folgt abrufen: $ extract = current ((array) $ json_query-> query-> pages) -> extract
MarcGuay
@LaurynasG, @MarcGuay Sie können der URL auch ` indexpageids als Parameter hinzufügen , um eine Liste der pageids zur einfacheren Iteration zu erhalten.
Rami
Ich habe die JSON-Ausgabe vom Wiki-Aufruf erhalten und dann den JSON in das Array $ data = json_decode ($ json, true) umgewandelt. Dann versuche ich den 'Extrakt' mit zu bekommen $extract = current((array)$data->query->pages)->extract;. Aber "Hinweis: Der Versuch, Eigentum von Nicht-Objekten zu erhalten" kommt immer wieder.
Shikhar Bansal
79

Es gibt tatsächlich eine sehr schöne Requisite namens Extrakte , die für Abfragen verwendet werden kann, die speziell für diesen Zweck entwickelt wurden. Mit Auszügen können Sie Artikelauszüge (abgeschnittener Artikeltext) abrufen. Es gibt einen Parameter namens exintro , mit dem der Text im nullten Abschnitt abgerufen werden kann (keine zusätzlichen Elemente wie Bilder oder Infoboxen). Sie können Auszüge auch mit einer feineren Granularität abrufen, z. B. durch eine bestimmte Anzahl von Zeichen ( Austausch ) oder durch eine bestimmte Anzahl von Sätzen ( Ausdrücke ).

Hier ist eine Beispielabfrage http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow und die API-Sandbox http://en.wikipedia.org/wiki/ Spezial: ApiSandbox # action = query & prop = extrahiert & format = json & exintro = & title = Stack% 20Overflow , um mehr mit dieser Abfrage zu experimentieren.

Bitte beachten Sie, dass Sie, wenn Sie den ersten Absatz speziell möchten, noch einige zusätzliche Analysen durchführen müssen, wie in der ausgewählten Antwort vorgeschlagen. Der Unterschied besteht darin, dass die von dieser Abfrage zurückgegebene Antwort kürzer ist als einige der anderen vorgeschlagenen API-Abfragen, da die API-Antwort zum Parsen keine zusätzlichen Elemente wie Bilder enthält.

AnthonyS
quelle
62

Seit 2017 bietet Wikipedia eine REST-API mit besserem Caching. In der Dokumentation finden Sie die folgende API, die perfekt zu Ihrem Anwendungsfall passt. (wie es von der neuen Funktion " Seitenvorschau" verwendet wird )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow Gibt die folgenden Daten zurück, mit denen ein Sommer mit einem kleinen Miniaturbild angezeigt werden kann:

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

Standardmäßig folgen Weiterleitungen (damit dies /api/rest_v1/page/summary/StackOverflowauch funktioniert), dies kann jedoch deaktiviert werden?redirect=false

Wenn Sie die API von einer anderen Domäne zugreifen möchten , können Sie die CORS - Header mit Set &origin=(zB &origin=*)

Update 2019: Die API scheint weitere nützliche Informationen über die Seite zurückzugeben.

lw1.at
quelle
1
Dies schließt auch "Typ" ein, was hervorragend ist, wenn Sie wissen müssen, ob das, was Sie gesucht haben, eine "Begriffsklärung" aufweist.
Jeel Shah
1
Beim Versuch, über meine Angular-basierte Anwendung auf diesen Link zuzugreifen, wird eine CORS-Fehlermeldung angezeigt. Kann mir jemand sagen, wie ich das beheben kann?
Praveen Ojha
2
Ist es möglich, auch eine Wikidata-ID abzufragen? Ich habe einige JSON-Daten, die ich extratiert habe. Sieht so aus. "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Können wir den Extrakt jetzt von der QID erhalten?
Sourav Chatterjee
1
Kann damit die Zusammenfassung von mehr als einer Seite geladen werden?
Cheesus
Was @SouravChatterjee verlangt hat, kann diese API verwendet werden, um nach Seiten-IDs zu suchen? Scheint nicht
Abhijit Sarkar
39

Mit diesem Code können Sie den Inhalt des ersten Absatzes der Seite im Klartext abrufen.

Teile dieser Antwort kommen von hier und damit von hier . Siehe MediaWiki - API - Dokumentation für weitere Informationen.

// 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
quelle
Wenn Sie jedoch nach "Koralle" suchen, ist das Ergebnis nicht erforderlich. Gibt es einen anderen Weg, so dass nur die p-Tags mit smmary aufgenommen werden können
Deepanshu Goyal
31

Ja da ist. Wenn Sie beispielsweise den Inhalt des ersten Abschnitts des Artikels Stapelüberlauf abrufen möchten , verwenden Sie eine Abfrage wie die folgende:

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

Die Teile bedeuten Folgendes:

  • format=xml: Gibt den Ergebnisformatierer als XML zurück. Andere Optionen (wie JSON) sind verfügbar. Dies hat keinen Einfluss auf das Format des Seiteninhalts selbst, sondern nur auf das einschließende Datenformat.

  • action=query&prop=revisions: Informationen zu den Überarbeitungen der Seite abrufen. Da wir nicht angeben, welche Revision verwendet wird, wird die neueste verwendet.

  • titles=Stack%20Overflow: Informationen zur Seite abrufen Stack Overflow. Es ist möglich, den Text mehrerer Seiten auf einmal abzurufen, wenn Sie deren Namen durch trennen |.

  • rvprop=content: Geben Sie den Inhalt (oder Text) der Revision zurück.

  • rvsection=0: Gibt nur Inhalte aus Abschnitt 0 zurück.

  • rvparse: Gibt den als HTML analysierten Inhalt zurück.

Beachten Sie, dass dies den gesamten ersten Abschnitt zurückgibt, einschließlich Dinge wie Hatnoten („Für andere Zwecke…“), Infoboxen oder Bilder.

Für verschiedene Sprachen stehen mehrere Bibliotheken zur Verfügung, die die Arbeit mit API erleichtern. Es ist möglicherweise besser für Sie, wenn Sie eine davon verwenden.

svick
quelle
3
Ich möchte nicht, dass der Inhalt Anzeigen-HTML analysiert, ich möchte nur den "Klartext" (weder Wikipedia-Code) erhalten
funkeln
1
Die API bietet so etwas nicht. Und ich kann verstehen, warum: Aus Sicht der API ist nicht klar, was genau dieser "Klartext" enthalten soll. Wie sollte es beispielsweise Tabellen darstellen, ob "[Zitieren erforderlich]", Navigationsfelder oder Bildbeschreibungen enthalten sein sollen?
Svick
2
Durch Hinzufügen &redirects=trueam Ende des Links wird sichergestellt, dass Sie zum Zielartikel gelangen, sofern einer vorhanden ist.
Eric.mitchell
14

Dies ist der Code, den ich gerade für eine Website verwende, die ich erstelle und die die führenden Absätze / Zusammenfassungen / Abschnitte 0 von Wikipedia-Artikeln abrufen muss. Dank der Magie geschieht dies alles im Browser (clientseitiges Javascript) von JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Es verwendet die Wikipedia-API, um die führenden Absätze (Abschnitt 0 genannt) in HTML wie folgt abzurufen : http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Anschließend werden der HTML-Code und andere unerwünschte Daten entfernt, sodass Sie eine saubere Zeichenfolge einer Artikelzusammenfassung erhalten. Wenn Sie möchten, können Sie mit ein wenig Optimierung ein "p" -Html-Tag um die führenden Absätze erhalten, aber im Moment gibt es nur eine neue Zeile Charakter zwischen ihnen.

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
quelle
Fügen Sie dies dem clientseitigen Skript hinzu? Wenn ja, ist das nicht XSS?
Craig
Es hat viele Fehler, versuchen Sie diesen Link mit Ihrem Skript: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht
8

Diese URL gibt eine Zusammenfassung im XML-Format zurück.

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

Ich habe eine Funktion erstellt, um die Beschreibung eines Schlüsselworts aus Wikipedia abzurufen.

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
quelle
5

Sie können Inhalte wie den ersten Absatz auch über DBPedia abrufen, das Wikipedia-Inhalte verwendet und daraus strukturierte Informationen (RDF) erstellt und diese über eine API verfügbar macht. Die DBPedia-API ist eine SPARQL-API (RDF-basiert), gibt jedoch JSON aus und ist recht einfach zu verpacken.

Als Beispiel hier ist eine supereinfache JS-Bibliothek namens WikipediaJS, die strukturierten Inhalt einschließlich einer Zusammenfassung des ersten Absatzes extrahieren kann: http://okfnlabs.org/wikipediajs/

Sie können mehr darüber in diesem Blog-Beitrag lesen: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

Den JS-Bibliothekscode finden Sie hier: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js

Rufus Pollock
quelle
1

Wenn Sie nur nach dem Text suchen, den Sie dann aufteilen können, aber die API nicht verwenden möchten, besuchen Sie en.wikipedia.org/w/index.php?title=Elephant&action=raw

mr.user1065741
quelle
"Bereit, auf meinen Websites angezeigt zu werden (also KEIN BBCODE oder WIKIPEDIA-Spezialcode!)" Und genau das ist das Gegenteil
Bluewhile
1

Mein Ansatz war wie folgt (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 Möglicherweise muss weiter gereinigt werden, aber das ist es im Grunde.

Alex
quelle
Es ist besser, utf8 von der API mit & utf8 =
TomoMiha
1

Ich habe die Lösung von @Michael Rapadas und @ Krinkle ausprobiert, aber in meinem Fall hatte ich Probleme, je nach Großschreibung einige Artikel zu finden. Wie hier:

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

Hinweis Ich habe die Antwort mit abgeschnitten exsentences=1

Anscheinend hat "Titelnormalisierung" nicht richtig funktioniert:

Die Titelnormalisierung konvertiert Seitentitel in ihre kanonische Form. Dies bedeutet, das erste Zeichen groß zu schreiben, Unterstriche durch Leerzeichen zu ersetzen und den Namespace in die für dieses Wiki definierte lokalisierte Form zu ändern. Die Titelnormalisierung erfolgt automatisch, unabhängig davon, welche Abfragemodule verwendet werden. Nachgestellte Zeilenumbrüche in Seitentiteln (\ n) führen jedoch zu ungewöhnlichem Verhalten und sollten zuerst entfernt werden.

Ich weiß, dass ich das Kapitalisierungsproblem leicht hätte lösen können, aber es gab auch die Unannehmlichkeit, das Objekt in ein Array umwandeln zu müssen.

Da ich eigentlich nur den ersten Absatz einer bekannten und definierten Suche wollte (kein Risiko, Informationen aus anderen Artikeln abzurufen), habe ich es so gemacht:

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

Beachten Sie in diesem Fall, dass ich die Kürzung mit gemacht habe limit=1

Diesen Weg:

  1. Ich kann sehr einfach auf die Antwortdaten zugreifen.
  2. Die Antwort ist ziemlich klein.

Aber wir müssen weiterhin vorsichtig mit der Großschreibung unserer Suche sein.

Weitere Informationen: https://www.mediawiki.org/wiki/API:Opensearch

Uhrmacher
quelle