Apakah ada wikipedia API bersih hanya untuk mengambil ringkasan konten?


150

Saya hanya perlu mengambil paragraf pertama dari halaman Wikipedia. Konten harus berformat html, siap untuk ditampilkan di situs web saya (jadi TIDAK ADA BBCODE, atau KODE khusus WIKIPEDIA!)


2
Wikipedia tidak menggunakan kode BB, ia menggunakan kode markup wiki sendiri.
svick

Tidak berfungsi untuk setiap artikel wikipedia. ro.wikipedia.org/w/…
dumitru

Jawaban:


205

Ada cara untuk mendapatkan seluruh "bagian intro" tanpa penguraian html! Mirip dengan jawaban AnthonyS dengan explaintextparam tambahan , Anda bisa mendapatkan teks bagian intro dalam teks biasa.

Pertanyaan

Mendapatkan intro Stack Overflow dalam teks biasa:

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

Respons JSON

(peringatan dilucuti)

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

Dokumentasi: API: query / prop = ekstrak


Sunting: Ditambahkan &redirects=1seperti yang direkomendasikan dalam komentar.


28
Sangat disarankan untuk menggunakan & pengalihan = 1 yang mengalihkan secara otomatis ke konten sinonim
joecks

6
Bagaimana saya bisa mendapatkan informasi dari respons JSON ini jika saya tidak tahu nomor halaman. Saya tidak dapat mengakses array JSON yang berisi "ekstrak"
Laurynas G

@LaurynasG Anda dapat melemparkan objek ke array dan kemudian ambil seperti ini: $ extract = current ((array) $ json_query-> query-> pages) -> extract
MarcGuay

@LaurynasG, @MarcGuay Anda juga dapat menambahkan ` indexpageid sebagai parameter ke URL untuk mendapatkan daftar pageid untuk pengulangan yang lebih mudah.
Rami

Saya mendapatkan output json dari panggilan wiki dan kemudian melemparkan json ke array $ data = json_decode ($ json, true). Lalu saya mencoba menggunakan 'ekstrak' $extract = current((array)$data->query->pages)->extract;. tetapi "Pemberitahuan: Mencoba mendapatkan properti yang bukan objek" terus muncul.
shikhar bansal

79

Sebenarnya ada prop yang sangat bagus yang disebut ekstrak yang dapat digunakan dengan pertanyaan yang dirancang khusus untuk tujuan ini. Ekstrak memungkinkan Anda untuk mendapatkan ekstrak artikel (teks artikel terpotong). Ada parameter yang disebut exintro yang dapat digunakan untuk mengambil teks di bagian nol (tidak ada aset tambahan seperti gambar atau kotak informasi). Anda juga dapat mengambil ekstrak dengan granularity yang lebih halus seperti dengan sejumlah karakter ( exchars ) atau dengan sejumlah kalimat tertentu ( exsentences )

Berikut adalah contoh permintaan http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow dan kotak pasir API http://en.wikipedia.org/wiki/ Khusus: ApiSandbox # action = query & prop = ekstrak & format = json & exintro = & title = Stack% 20Overflow untuk bereksperimen lebih banyak dengan query ini.

Harap perhatikan bahwa jika Anda menginginkan paragraf pertama secara spesifik, Anda masih perlu melakukan parsing tambahan seperti yang disarankan dalam jawaban yang dipilih. Perbedaannya di sini adalah bahwa respons yang dikembalikan oleh kueri ini lebih pendek daripada beberapa kueri api lain yang disarankan karena Anda tidak memiliki aset tambahan seperti gambar di respons api untuk diuraikan.


62

Sejak 2017 Wikipedia menyediakan API REST dengan caching yang lebih baik. Dalam dokumentasi Anda dapat menemukan API berikut yang sangat cocok dengan kasus penggunaan Anda. (seperti yang digunakan oleh fitur Pratinjau Halaman baru )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow mengembalikan data berikut yang dapat digunakan untuk menampilkan musim panas dengan thumbnail kecil:

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

Secara default, ini mengikuti pengalihan (sehingga /api/rest_v1/page/summary/StackOverflowjuga berfungsi), tetapi ini dapat dinonaktifkan dengan?redirect=false

Jika Anda perlu mengakses API dari domain lain, Anda dapat mengatur header CORS dengan &origin=(misalnya &origin=*)

Pembaruan 2019: API tampaknya mengembalikan informasi yang lebih berguna tentang halaman.


1
Ini juga termasuk "tipe" yang sangat baik jika Anda perlu tahu apakah apa yang Anda cari memiliki "disambiguasi".
Jeel Shah

1
Saya mendapatkan kesalahan CORS ketika mencoba mengakses tautan ini dari aplikasi berbasis Angular saya, adakah yang bisa memberitahu saya cara mengatasinya.
Praveen Ojha

2
Apakah mungkin juga meminta dengan ID wikidata? Saya memiliki beberapa data json yang saya ekstratktasikan yang terlihat seperti "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Bisakah kita mendapatkan ekstrak sekarang dengan QID?
Sourav Chatterjee

1
Apakah ini dapat digunakan untuk memuat ringkasan lebih dari satu halaman?
cheesus

Apa yang diminta oleh @SouravChatterjee, dapatkah API ini digunakan untuk mencari berdasarkan id halaman? Sepertinya tidak
Abhijit Sarkar

39

Kode ini memungkinkan Anda untuk mengambil konten paragraf pertama halaman dalam teks biasa.

Sebagian dari jawaban ini datang dari sini dan dari sini . Lihat dokumentasi MediaWiki API untuk informasi lebih lanjut.

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

Tetapi jika Anda mencari "karang", hasilnya akan menjadi sesuatu yang tidak diperlukan. Apakah ada cara lain, sehingga hanya tag p dengan smmary dapat diambil
Deepanshu Goyal

31

Ya ada. Misalnya, jika Anda ingin mendapatkan konten dari bagian pertama artikel Stack Overflow , gunakan kueri seperti ini:

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

Bagian artinya:

  • format=xml: Kembalikan pemformat hasil sebagai XML. Opsi lain (seperti JSON) tersedia. Ini tidak memengaruhi format konten halaman itu sendiri, hanya format data terlampir.

  • action=query&prop=revisions: Dapatkan informasi tentang revisi halaman. Karena kami tidak menentukan revisi mana, revisi terbaru digunakan.

  • titles=Stack%20Overflow: Dapatkan informasi tentang halaman Stack Overflow. Dimungkinkan untuk mendapatkan teks dari lebih banyak halaman sekaligus, jika Anda memisahkan namanya |.

  • rvprop=content: Kembalikan konten (atau teks) revisi.

  • rvsection=0: Hanya kembalikan konten dari bagian 0.

  • rvparse: Kembalikan konten yang diuraikan sebagai HTML.

Perlu diingat bahwa ini mengembalikan seluruh bagian pertama termasuk hal-hal seperti hatnotes ("Untuk kegunaan lain ..."), kotak info atau gambar.

Ada beberapa perpustakaan yang tersedia untuk berbagai bahasa yang membuat bekerja dengan API lebih mudah, mungkin lebih baik bagi Anda jika Anda menggunakan salah satu dari mereka.


3
Saya tidak ingin konten mem-parsing iklan HTML, saya hanya ingin mendapatkan "teks biasa" (bukan kode wikipedia)
sparkle

1
API tidak menawarkan hal seperti itu. Dan saya bisa mengerti mengapa: karena dari perspektif API, tidak jelas apa sebenarnya isi "teks biasa" ini. Sebagai contoh, bagaimana seharusnya mewakili tabel, apakah akan memasukkan "[rujukan?]", Kotak navigasi atau deskripsi gambar.
svick

2
Menambahkan &redirects=trueke akhir tautan memastikan Anda mendapatkan artikel tujuan, jika ada.
eric.mitchell

14

Ini adalah kode yang saya gunakan saat ini untuk situs web yang saya buat yang perlu mendapatkan paragraf / ringkasan / bagian 0 dari artikel Wikipedia, dan semuanya dilakukan di dalam browser (javascript sisi klien) berkat magick dari JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Ini menggunakan API Wikipedia untuk mendapatkan paragraf terkemuka (disebut bagian 0) dalam HTML seperti: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Ini kemudian menghapus HTML dan data yang tidak diinginkan lainnya, memberi Anda serangkaian ringkasan artikel yang bersih, jika Anda mau, dengan sedikit penyesuaian, dapatkan tag html "p" di sekitar paragraf terkemuka, tetapi saat ini hanya ada baris baru karakter di antara mereka.

Kode:

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

Apakah Anda menambahkan ini ke skrip sisi klien? Jika demikian, bukankah itu XSS?
craig

Ada banyak bug, coba tautan ini dengan skrip Anda: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht

8

URL ini akan mengembalikan ringkasan dalam format xml.

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

Saya telah membuat fungsi untuk mengambil deskripsi kata kunci dari 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

Anda juga bisa mendapatkan konten seperti pagagraf pertama melalui DBPedia yang mengambil konten Wikipedia dan membuat informasi terstruktur darinya (RDF) dan membuatnya tersedia melalui API. DBPedia API adalah SPARQL (berbasis RDF) tetapi menghasilkan JSON dan cukup mudah untuk dibungkus.

Sebagai contoh di sini adalah perpustakaan JS super sederhana bernama WikipediaJS yang dapat mengekstraksi konten terstruktur termasuk ringkasan paragraf pertama: http://okfnlabs.org/wikipediajs/

Anda dapat membaca lebih lanjut tentang hal ini di posting blog ini: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-jajacriptcript-library-for-accessing-wikipedia-article-information.html

Kode perpustakaan JS dapat ditemukan di sini: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Jika Anda hanya mencari teks yang dapat Anda pisah tetapi tidak ingin menggunakan API, lihat en.wikipedia.org/w/index.php?title=Elephant&action=raw


"siap ditampilkan di situs web saya (jadi TIDAK ADA BBCODE, atau KODE khusus WIKIPEDIA!)" Dan ini persis situs
lawan

1

Pendekatan saya adalah sebagai berikut (dalam 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 mungkin perlu dibersihkan lebih lanjut, tetapi pada dasarnya itu saja.


Lebih baik untuk meminta utf8 dari API dengan & utf8 =
TomoMiha

1

Saya mencoba @Michael Rapadas dan solusi @ Krinkle tetapi dalam kasus saya, saya mengalami kesulitan untuk menemukan beberapa artikel tergantung dari kapitalisasi. Seperti di sini:

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

Catatan saya memotong respons dengan exsentences=1

Tampaknya "normalisasi judul" tidak berfungsi dengan benar:

Normalisasi judul mengubah judul halaman menjadi bentuk kanonik mereka. Ini berarti menggunakan huruf besar karakter pertama, mengganti garis bawah dengan spasi, dan mengubah namespace ke bentuk terlokalisasi yang ditentukan untuk wiki itu. Normalisasi judul dilakukan secara otomatis, terlepas dari modul kueri yang digunakan. Namun, setiap garis trailing yang terputus dalam judul halaman (\ n) akan menyebabkan perilaku aneh dan mereka harus dihapus terlebih dahulu.

Saya tahu saya bisa menyelesaikan masalah kapitalisasi dengan mudah tetapi ada juga ketidaknyamanan karena harus membuang objek ke array.

Jadi karena saya benar-benar menginginkan paragraf pertama dari pencarian yang terkenal dan terdefinisi (tidak ada risiko untuk mengambil info dari artikel lain) saya melakukannya seperti ini:

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

Perhatikan dalam hal ini saya melakukan pemotongan limit=1

Cara ini:

  1. Saya dapat mengakses data respons dengan sangat mudah.
  2. Responsnya cukup kecil.

Tetapi kita harus tetap berhati-hati dengan penggunaan huruf kapital pencarian kita.

Info lebih lanjut: https://www.mediawiki.org/wiki/API:Opensearch

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.