Có API wikipedia sạch chỉ để lấy tóm tắt nội dung?


150

Tôi chỉ cần lấy đoạn đầu tiên của trang Wikipedia. Nội dung phải được định dạng html, sẵn sàng để được hiển thị trên các trang web của tôi (vì vậy KHÔNG CÓ BBCODE hoặc MÃ đặc biệt của WIKIPEDIA!)


2
Wikipedia không sử dụng mã BB, ​​nó sử dụng mã đánh dấu wiki riêng.
Svick

Nó không hoạt động cho mọi bài viết trên wikipedia. ro.wikipedia.org/w/ từ
dumitru

Câu trả lời:


205

Có một cách để có được toàn bộ "phần giới thiệu" mà không cần bất kỳ phân tích cú pháp html nào! Tương tự như câu trả lời của AnthonyS với một thông số bổ sung explaintext, bạn có thể lấy văn bản phần giới thiệu bằng văn bản thuần túy.

Truy vấn

Bắt phần giới thiệu của Stack Overflow trong văn bản thuần túy:

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

Phản hồi JSON

(cảnh báo tước)

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

Tài liệu: API: query / prop = trích xuất


Chỉnh sửa: Đã thêm &redirects=1theo khuyến nghị trong các bình luận.


28
Rất khuyến khích sử dụng & chuyển hướng = 1 tự động chuyển hướng đến nội dung của các từ đồng nghĩa
tham gia

6
Làm cách nào tôi có thể nhận thông tin từ phản hồi JSON này nếu tôi không biết số trang. Tôi không thể truy cập mảng JSON có chứa "trích xuất"
Laurynas G

@LaurynasG Bạn có thể truyền đối tượng vào một mảng và sau đó lấy nó như thế này: $ extract = current ((mảng) $ json_query-> query-> page) -> extract
MarcGuay 15/03/2016

@LaurynasG, @MarcGuay Bạn cũng có thể thêm ` indexpageids làm tham số cho URL để có danh sách các trang web để lặp lại dễ dàng hơn.
Rami

Tôi đã nhận được đầu ra json từ cuộc gọi wiki và sau đó chuyển json thành mảng $ data = json_decode ($ json, true). Sau đó, tôi cố gắng để có được "giải nén" bằng cách sử dụng $extract = current((array)$data->query->pages)->extract;. nhưng "Lưu ý: Cố gắng lấy tài sản của phi đối tượng" vẫn tiếp tục.
shikhar bansal

79

Có thực sự là một rất đẹp prop gọi là chiết xuất có thể được sử dụng với các truy vấn thiết kế đặc biệt cho mục đích này. Trích xuất cho phép bạn có được trích xuất bài viết (văn bản bài viết cắt ngắn). Có một tham số gọi là exintro có thể được sử dụng để truy xuất văn bản trong phần zeroth (không có tài sản bổ sung như hình ảnh hoặc hộp thông tin). Bạn cũng có thể truy xuất các trích đoạn với độ chi tiết mịn hơn, chẳng hạn như bằng một số ký tự ( exchars ) nhất định hoặc bằng một số câu nhất định ( exsentences )

Dưới đây là một truy vấn mẫu http://en.wikipedia.org/w/api.php?action=query&prop=extuces&format=json&exintro=&title=Stack%20Overflowhộp cát API http://en.wikipedia.org/wiki/ Đặc biệt: ApiSandbox # action = query & prop = extuces & format = json & exintro = & title = Stack% 20Overflow để thử nghiệm nhiều hơn với truy vấn này.

Xin lưu ý rằng nếu bạn muốn đoạn đầu tiên cụ thể, bạn vẫn cần thực hiện một số phân tích bổ sung như được đề xuất trong câu trả lời đã chọn. Sự khác biệt ở đây là phản hồi được trả về bởi truy vấn này ngắn hơn một số truy vấn api khác được đề xuất vì bạn không có tài sản bổ sung như hình ảnh trong phản hồi api để phân tích cú pháp.


62

Kể từ năm 2017 Wikipedia cung cấp API REST với bộ nhớ đệm tốt hơn. Trong tài liệu bạn có thể tìm thấy API sau hoàn toàn phù hợp với trường hợp sử dụng của bạn. (vì nó được sử dụng bởi tính năng Xem trước trang mới )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow trả về dữ liệu sau có thể được sử dụng để hiển thị một bản tóm tắt với hình thu nhỏ:

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

Theo mặc định, nó tuân theo các chuyển hướng (do đó /api/rest_v1/page/summary/StackOverflowcũng hoạt động), nhưng điều này có thể bị vô hiệu hóa với?redirect=false

Nếu bạn cần truy cập API từ một tên miền khác, bạn có thể đặt tiêu đề CORS với &origin=(ví dụ &origin=*)

Cập nhật 2019: API dường như trả về nhiều thông tin hữu ích hơn về trang.


1
Điều này cũng bao gồm "loại" rất tuyệt vời nếu bạn cần biết liệu những gì bạn tìm kiếm có "định hướng" hay không.
Jeel Shah

1
Tôi đang gặp lỗi CORS trong khi cố gắng truy cập liên kết này từ ứng dụng Angular của mình, bất cứ ai cũng có thể cho tôi biết cách giải quyết vấn đề đó.
Praveen Ojha

2
Có thể truy vấn bằng ID wikidata không? Tôi có một số dữ liệu json tôi đã xuất hiện, trông giống như "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""chúng ta có thể lấy trích xuất ngay bây giờ bằng QID không?
Sourav Chatterjee

1
Điều này có thể được sử dụng để tải tóm tắt của nhiều hơn một trang?
pho mát

Những gì @SouravChatterjee yêu cầu, API này có thể được sử dụng để tìm kiếm theo id trang không? Có vẻ như không
Abhijit Sarkar

39

Mã này cho phép bạn truy xuất nội dung của đoạn đầu tiên của trang bằng văn bản thuần túy.

Các phần của câu trả lời này đến từ đây và do đó ở đây . Xem tài liệu API MediaWiki để biết thêm thông tin.

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

Nhưng nếu bạn tìm kiếm "san hô", kết quả sẽ là một cái gì đó không bắt buộc. Có cách nào khác không, để chỉ có thể chọn các thẻ p với smmary
Deepanshu Goyalty

31

Có, có. Ví dụ: nếu bạn muốn lấy nội dung của phần đầu tiên của bài viết Stack Overflow , hãy sử dụng truy vấn như sau:

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

Các phần có nghĩa này:

  • format=xml: Trả về định dạng kết quả dưới dạng XML. Các tùy chọn khác (như JSON) có sẵn. Điều này không ảnh hưởng đến định dạng của chính nội dung trang, chỉ có định dạng dữ liệu kèm theo.

  • action=query&prop=revisions: Nhận thông tin về các phiên bản của trang. Vì chúng tôi không chỉ định bản sửa đổi nào, bản mới nhất được sử dụng.

  • titles=Stack%20Overflow: Nhận thông tin về trang Stack Overflow. Có thể lấy văn bản của nhiều trang hơn trong một lần, nếu bạn tách tên của chúng theo |.

  • rvprop=content: Trả lại nội dung (hoặc văn bản) của bản sửa đổi.

  • rvsection=0: Chỉ trả lại nội dung từ phần 0.

  • rvparse: Trả về nội dung được phân tích cú pháp dưới dạng HTML.

Hãy nhớ rằng phần này trả về toàn bộ phần đầu tiên, bao gồm cả những thứ như hatnotes (đối với các mục đích sử dụng khác khác), hộp thông tin hoặc hình ảnh.

Có một số thư viện có sẵn cho các ngôn ngữ khác nhau giúp làm việc với API dễ dàng hơn, nó có thể tốt hơn cho bạn nếu bạn sử dụng một trong số các ngôn ngữ đó.


3
Tôi không muốn nội dung được phân tích cú pháp HTML, tôi chỉ muốn lấy "văn bản thuần túy" (không phải mã wikipedia)
lấp lánh

1
API không cung cấp bất cứ thứ gì như thế. Và tôi có thể hiểu tại sao: bởi vì từ quan điểm của API, không rõ chính xác "văn bản thuần túy" này nên chứa cái gì. Ví dụ: nó nên biểu thị các bảng như thế nào, có bao gồm "[cần dẫn nguồn]", các hộp điều hướng hoặc mô tả hình ảnh.
Svick

2
Thêm &redirects=truevào cuối liên kết đảm bảo bạn có được bài viết đích, nếu có.
eric.mitchell

14

Đây là mã tôi đang sử dụng ngay bây giờ cho một trang web tôi đang thực hiện để có được các đoạn / tóm tắt / phần 0 hàng đầu trong số các bài viết trên Wikipedia và tất cả được thực hiện trong trình duyệt (javascript phía máy khách) nhờ vào phép thuật của JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Nó sử dụng API Wikipedia để có được các đoạn văn bản hàng đầu (được gọi là phần 0) trong HTML như vậy: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Sau đó, nó loại bỏ HTML và các dữ liệu không mong muốn khác, cung cấp cho bạn một chuỗi tóm tắt bài viết rõ ràng, nếu bạn muốn, với một chút điều chỉnh, hãy lấy thẻ html "p" xung quanh các đoạn đầu nhưng ngay bây giờ chỉ có một dòng mới nhân vật giữa họ.

Mã số:

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

Bạn có thêm phần này vào tập lệnh phía máy khách không? Nếu vậy, đó không phải là XSS?
craig

Nó có rất nhiều lỗi, hãy thử liên kết này với tập lệnh của bạn: en.wikipedia.org/wiki/Modular_Advified_Armed_Robotic_System
rohankvashisht

8

Url này sẽ trả về tóm tắt ở định dạng xml.

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

Tôi đã tạo một chức năng để tìm nạp mô tả của một từ khóa từ 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

Bạn cũng có thể nhận được nội dung như pagagraph đầu tiên qua dbpedia mà mất nội dung Wikipedia và tạo ra thông tin có cấu trúc từ nó (RDF) và làm sẵn này thông qua một API. API DBPedia là một SPARQL (dựa trên RDF) nhưng nó tạo ra JSON và nó khá dễ dàng để bọc.

Như một ví dụ ở đây, một thư viện JS siêu đơn giản có tên WikipediaJS có thể trích xuất nội dung có cấu trúc bao gồm một đoạn đầu tiên tóm tắt: http://okfnlabs.org/wikipediajs/

Bạn có thể đọc thêm về nó trong bài đăng trên blog này: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-l Library-for-access-wikipedia-article-inif.html

Mã thư viện JS có thể được tìm thấy ở đây: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Nếu bạn chỉ tìm kiếm văn bản mà sau đó bạn có thể tách ra nhưng không muốn sử dụng API, hãy xem en.wikipedia.org/w/index.php?title=Elephant&action=raw


"sẵn sàng để được hiển thị trên các trang web của tôi (vì vậy KHÔNG CÓ BBCODE, hoặc MÃ đặc biệt của WIKIPEDIA!)" Và đây chính xác là oppsite
bluewhile

1

Cách tiếp cận của tôi là như sau (trong 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 có thể cần làm sạch thêm, nhưng về cơ bản là như vậy.


Tốt hơn là hỏi utf8 từ API với & utf8 =
TomoMiha

1

Tôi đã thử giải pháp của @Michael Rapadas và @ Krinkle nhưng trong trường hợp của tôi, tôi gặp khó khăn khi tìm một số bài viết tùy thuộc vào cách viết hoa. Giống như ở đây:

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

Lưu ý tôi đã cắt ngắn phản hồi với exsentences=1

Rõ ràng "bình thường hóa tiêu đề" không hoạt động chính xác:

Chuẩn hóa tiêu đề chuyển đổi tiêu đề trang thành dạng chính tắc của chúng. Điều này có nghĩa là viết hoa ký tự đầu tiên, thay thế dấu gạch dưới bằng dấu cách và thay đổi không gian tên thành dạng cục bộ được xác định cho wiki đó. Chuẩn hóa tiêu đề được thực hiện tự động, bất kể mô-đun truy vấn nào được sử dụng. Tuy nhiên, bất kỳ ngắt dòng nào trong tiêu đề trang (\ n) sẽ gây ra hành vi kỳ quặc và chúng nên bị loại bỏ trước tiên.

Tôi biết rằng tôi có thể đã sắp xếp vấn đề viết hoa một cách dễ dàng nhưng cũng có sự bất tiện khi phải đặt đối tượng vào một mảng.

Vì vậy, vì tôi thực sự muốn đoạn đầu tiên của một tìm kiếm nổi tiếng và được xác định (không có rủi ro để lấy thông tin từ các bài viết khác) tôi đã làm như thế này:

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

Lưu ý trong trường hợp này tôi đã thực hiện cắt ngắn với limit=1

Cách này:

  1. Tôi có thể truy cập dữ liệu phản hồi rất dễ dàng.
  2. Phản hồi khá nhỏ.

Nhưng chúng ta phải tiếp tục cẩn thận với chữ viết hoa của tìm kiếm.

Thông tin thêm: https://www.mediawiki.org/wiki/API:Opensearch

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.