Czy istnieje czysty interfejs API Wikipedii tylko do pobierania podsumowania treści?


150

Muszę tylko pobrać pierwszy akapit strony Wikipedii. Treść musi być sformatowana w formacie html, gotowa do wyświetlania na moich stronach internetowych (więc BEZ BBCODE lub specjalnego KODU WIKIPEDIA!)


2
Wikipedia nie używa kodu BB, używa własnego kodu znaczników wiki.
Svick

Nie działa dla każdego artykułu w Wikipedii. ro.wikipedia.org/w/…
dumitru

Odpowiedzi:


205

Jest sposób, aby uzyskać całą „sekcję intro” bez przetwarzania kodu HTML! Podobnie jak w przypadku odpowiedzi AnthonyS z dodatkowym explaintextparametrem, tekst sekcji wstępu można uzyskać w postaci zwykłego tekstu.

Pytanie

Pobieranie wprowadzenia Stack Overflow w postaci zwykłego tekstu:

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

Odpowiedź JSON

(ostrzeżenia usunięte)

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

Dokumentacja: API: query / prop = extracts


Edycja: dodano &redirects=1zgodnie z zaleceniami w komentarzach.


28
Bardzo zalecane jest użycie & redirects = 1, które automatycznie przekierowuje do treści synonimów
joecks

6
Jak mogę uzyskać informacje z tej odpowiedzi JSON, jeśli nie znam numeru strony. Nie mogę uzyskać dostępu do tablicy JSON zawierającej „extract”
Laurynas G

@LaurynasG Możesz rzucić obiekt na tablicę, a następnie pobrać go w następujący sposób: $ extract = current ((array) $ json_query-> query-> pages) -> extract
MarcGuay

@LaurynasG, @MarcGuay Możesz także dodać ` indexpageids jako parametr do adresu URL, aby uzyskać listę pageids dla łatwiejszej iteracji.
Rami

Otrzymałem dane wyjściowe json z wywołania wiki, a następnie rzuciłem json na tablicę $ data = json_decode ($ json, true). Następnie próbuję uzyskać „ekstrakt” za pomocą $extract = current((array)$data->query->pages)->extract;. ale „Uwaga: próba uzyskania właściwości niebędącej przedmiotem” wciąż się pojawia.
shikhar bansal

79

W rzeczywistości istnieje bardzo fajna właściwość zwana ekstraktami, której można używać z zapytaniami zaprojektowanymi specjalnie do tego celu. Wyciągi pozwalają uzyskać fragmenty artykułu (obcięty tekst artykułu). Istnieje parametr o nazwie exintro, którego można użyć do pobrania tekstu w sekcji zerowej (bez dodatkowych zasobów, takich jak obrazy lub infoboksy). Możesz także pobierać fragmenty o większej szczegółowości, takie jak pewna liczba znaków ( wymiany ) lub określona liczba zdań ( exsentences )

Oto przykładowe zapytanie http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow i piaskownica API http://en.wikipedia.org/wiki/ Special: ApiSandbox # action = query & prop = extracts & format = json & exintro = & titles = Stack% 20Overflow, aby eksperymentować z tym zapytaniem.

Zwróć uwagę, że jeśli chcesz konkretnie zapoznać się z pierwszym akapitem, nadal musisz wykonać dodatkowe przetwarzanie, zgodnie z sugestią w wybranej odpowiedzi. Różnica polega na tym, że odpowiedź zwrócona przez to zapytanie jest krótsza niż niektóre inne sugerowane zapytania interfejsu API, ponieważ nie masz dodatkowych zasobów, takich jak obrazy w odpowiedzi interfejsu API do analizy.


62

Od 2017 roku Wikipedia udostępnia REST API z lepszym buforowaniem. W dokumentacji możesz znaleźć następujące API, które idealnie pasuje do twojego przypadku użycia. (tak jak jest używana w nowej funkcji Podgląd strony )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow zwraca następujące dane, których można użyć do wyświetlenia podsumowania z małą miniaturą:

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

Domyślnie podąża za przekierowaniami (więc to /api/rest_v1/page/summary/StackOverflowrównież działa), ale można to wyłączyć za pomocą?redirect=false

Jeśli potrzebujesz dostępu do API z innej domeny, możesz ustawić nagłówek CORS za pomocą &origin=(np. &origin=*)

Aktualizacja 2019: wydaje się, że API zwraca bardziej przydatne informacje o stronie.


1
Obejmuje to również „typ”, który jest doskonały, jeśli chcesz wiedzieć, czy wyszukiwane hasło ma „ujednoznacznienie”.
Jeel Shah

1
Otrzymuję błąd CORS podczas próby uzyskania dostępu do tego łącza z mojej aplikacji opartej na Angular, czy ktoś może mi powiedzieć, jak rozwiązać ten problem.
Praveen Ojha

2
Czy można również zapytać o identyfikator wikidata? Mam kilka danych json, które wyodrębniłem, które wyglądają następująco: "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Czy możemy teraz uzyskać wyciąg za pomocą identyfikatora QID?
Sourav Chatterjee

1
Czy można tego użyć do załadowania podsumowania więcej niż jednej strony?
cheesus

O co prosił @SouravChatterjee, czy ten interfejs API może być używany do wyszukiwania według identyfikatorów stron? Wydaje się nie
Abhijit Sarkar

39

Ten kod umożliwia pobranie zawartości pierwszego akapitu strony w postaci zwykłego tekstu.

Część tej odpowiedzi pochodzi stąd, a więc stąd . Zobacz dokumentację MediaWiki API , aby uzyskać więcej informacji.

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

Ale jeśli wyszukasz „koral”, wynik będzie niepotrzebny. Czy jest jakiś inny sposób, aby można było odebrać tylko tagi p ze smmary
Deepanshu Goyal

31

Tak jest. Na przykład, jeśli chcesz uzyskać zawartość pierwszej sekcji artykułu Stack Overflow , użyj zapytania takiego:

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

Części oznaczają to:

  • format=xml: Zwróć program formatujący wynik jako XML. Dostępne są inne opcje (takie jak JSON). Nie ma to wpływu na format samej zawartości strony, tylko na otaczający format danych.

  • action=query&prop=revisions: Uzyskaj informacje o wersjach strony. Ponieważ nie określamy, która rewizja, używana jest najnowsza.

  • titles=Stack%20Overflow: Uzyskaj informacje o stronie Stack Overflow. Możliwe jest pobranie tekstu większej liczby stron za jednym razem, jeśli oddzielisz ich nazwy za pomocą |.

  • rvprop=content: Zwróć treść (lub tekst) wersji.

  • rvsection=0: Zwróć tylko zawartość z sekcji 0.

  • rvparse: Zwróć treść przeanalizowaną jako HTML.

Należy pamiętać, że zwraca to całą pierwszą sekcję, w tym takie rzeczy, jak hatnotes („Do innych zastosowań…”), infoboksy lub obrazy.

Dostępnych jest kilka bibliotek dla różnych języków, które ułatwiają pracę z API, może być lepiej, jeśli użyjesz jednej z nich.


3
Nie chcę, aby treść była analizowana w HTML reklamy, chcę tylko uzyskać „zwykły tekst” (ani kod wikipedii)
sparkle

1
API niczego takiego nie oferuje. Rozumiem dlaczego: ponieważ z punktu widzenia API nie jest jasne, co dokładnie powinien zawierać ten „zwykły tekst”. Na przykład, w jaki sposób ma przedstawiać tabele, czy zawierać „[potrzebne źródło]”, pola nawigacyjne lub opisy obrazów.
svick

2
Dodanie &redirects=truena końcu linku gwarantuje, że dotrzesz do artykułu docelowego, jeśli taki istnieje.
eric.mitchell

14

To jest kod, którego teraz używam dla strony internetowej, którą tworzę, która musi pobierać wiodące akapity / podsumowanie / sekcję 0 artykułów spoza Wikipedii, a wszystko to odbywa się w przeglądarce (javascript po stronie klienta) dzięki magii JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Używa interfejsu API Wikipedii, aby uzyskać wiodące akapity (zwane sekcją 0) w HTML, jak na przykład: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Następnie usuwa kod HTML i inne niepożądane dane, dając czysty ciąg podsumowania artykułu, jeśli chcesz, możesz po drobnych poprawkach uzyskać znacznik html "p" wokół początkowych akapitów, ale teraz jest tylko nowa linia charakter między nimi.

Kod:

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

Czy dodajesz to do skryptu po stronie klienta? Jeśli tak, czy to nie XSS?
craig

Ma wiele błędów, wypróbuj ten link ze swoim skryptem: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht

8

Ten adres URL zwróci podsumowanie w formacie xml.

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

Stworzyłem funkcję do pobierania opisu słowa kluczowego z Wikipedii.

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

Możesz również pobrać zawartość, taką jak pierwszy pagagram, za pośrednictwem DBPedia, która pobiera zawartość Wikipedii i tworzy z niej ustrukturyzowane informacje (RDF) i udostępnia je za pośrednictwem interfejsu API. DBPedia API jest interfejsem SPARQL (opartym na RDF), ale wysyła JSON i jest dość łatwy do zapakowania.

Jako przykład podajemy bardzo prostą bibliotekę JS o nazwie WikipediaJS, która może wyodrębniać ustrukturyzowaną zawartość, w tym podsumowanie pierwszego akapitu: http://okfnlabs.org/wikipediajs/

Możesz przeczytać więcej na ten temat w tym poście na blogu: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

Kod biblioteki JS można znaleźć tutaj: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Jeśli szukasz tylko tekstu, który możesz następnie podzielić, ale nie chcesz korzystać z API, zajrzyj na en.wikipedia.org/w/index.php?title=Elephant&action=raw


„gotowe do wyświetlenia na moich stronach internetowych (więc BEZ BBCODE lub specjalnego KODU WIKIPEDIA!)” I to jest dokładnie ta strona
niebieska podczas

1

Moje podejście było następujące (w 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 może wymagać dalszego czyszczenia, ale to w zasadzie wszystko.


Lepiej jest zapytać utf8 z API za pomocą & utf8 =
TomoMiha

1

Wypróbowałem rozwiązanie @Michael Rapadas i @ Krinkle, ale w moim przypadku miałem problem ze znalezieniem niektórych artykułów w zależności od wielkości liter. Jak tutaj:

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

Uwaga Skróciłem odpowiedź z exsentences=1

Najwyraźniej „normalizacja tytułu” nie działała poprawnie:

Normalizacja tytułów konwertuje tytuły stron do ich postaci kanonicznej. Oznacza to zamianę pierwszego znaku na wielką literę, zastąpienie podkreślenia spacjami i zmianę przestrzeni nazw na zlokalizowaną formę zdefiniowaną dla tej wiki. Normalizacja tytułu jest wykonywana automatycznie, niezależnie od używanych modułów zapytań. Jednak wszelkie końcowe podziały wierszy w tytułach stron (\ n) spowodują dziwne zachowanie i należy je najpierw usunąć.

Wiem, że mogłem łatwo rozwiązać problem z wielkimi literami, ale była też niedogodność związana z koniecznością rzutowania obiektu na tablicę.

Tak więc, ponieważ bardzo chciałem uzyskać pierwszy akapit dobrze znanego i zdefiniowanego wyszukiwania (bez ryzyka pobierania informacji z innych artykułów), zrobiłem to tak:

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

Uwaga w tym przypadku zrobiłem obcięcie z limit=1

Tą drogą:

  1. Mam bardzo łatwy dostęp do danych odpowiedzi.
  2. Odpowiedź jest niewielka.

Musimy jednak uważać na wielkie litery w naszych wynikach wyszukiwania.

Więcej informacji: https://www.mediawiki.org/wiki/API:Opensearch

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.