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!).
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!).
Antworten:
Es gibt eine Möglichkeit, den gesamten "Intro-Bereich" ohne HTML-Analyse abzurufen! Ähnlich wie bei der Antwort von AnthonyS mit einem zusätzlichen explaintext
Parameter können Sie den Text des Intro-Abschnitts im Klartext erhalten.
Das Intro von Stack Overflow im Klartext abrufen:
(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=1
Wie in den Kommentaren empfohlen hinzugefügt .
$extract = current((array)$data->query->pages)->extract;
. Aber "Hinweis: Der Versuch, Eigentum von Nicht-Objekten zu erhalten" kommt immer wieder.
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.
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/StackOverflow
auch 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.
"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?
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§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.
}
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:
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.
&redirects=true
am Ende des Links wird sichergestellt, dass Sie zum Zielartikel gelangen, sofern einer vorhanden ist.
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§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
}
});
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');
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
Der abstract.xml.gz
Dump klingt wie der, den Sie wollen.
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
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.
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:
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:
Aber wir müssen weiterhin vorsichtig mit der Großschreibung unserer Suche sein.
Weitere Informationen: https://www.mediawiki.org/wiki/API:Opensearch