Чи є чистий API wikipedia лише для отримання резюме вмісту?


150

Мені просто потрібно отримати перший абзац сторінки Вікіпедії. Вміст має бути відформатований у форматі html, готовий до відображення на моїх веб-сайтах (так що НЕ BBCODE чи спеціального КОДУ WIKIPEDIA!)


2
У Вікіпедії не використовується код BB, він використовує власний код розмітки wiki.
svick

Це працює не для кожної статті вікіпедії. ro.wikipedia.org/w / ...
Думітру

Відповіді:


205

Існує спосіб отримати весь "вступний розділ" без будь-якого html-розбору! Подібно Anthonys ігрового відповіді з додатковими explaintextпарами, ви можете отримати вступний текст розділу у вигляді простого тексту.

Запит

Отримання вступу стека Overflow у звичайному тексті:

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

Відповідь JSON

(попередження позбавлені)

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

Документація: API: запит / prop = витяги


Редагувати: Додано, &redirects=1як рекомендовано в коментарях.


28
Дуже рекомендується використовувати & redirects = 1, який автоматично перенаправляє вміст синонімів
joecks

6
Як я можу отримати інформацію з цієї відповіді JSON, якщо я не знаю номер сторінки. Я не можу отримати доступ до масиву JSON, що містить "екстракт"
Laurynas G

@LaurynasG Ви можете кинути об'єкт на масив, а потім схопити його так: $ extra = current ((масив) $ json_query-> query-> pages) -> extract
MarcGuay

@LaurynasG, @MarcGuay Ви також можете додати до URL-адреси ` indexpageids як параметр, щоб отримати список сторінок для легшої ітерації.
Рамі

Я отримав вихід json з виклику wiki, а потім закинув json для масиву $ data = json_decode ($ json, правда). Тоді я намагаюся отримати "екстракт", використовуючи $extract = current((array)$data->query->pages)->extract;. але "Примітка: Спроба отримати властивість не-об'єкта" продовжує продовжуватись.
шинхарський бансал

79

Насправді є дуже приємна опора під назвою витяжки, яку можна використовувати із запитами, розробленими спеціально для цієї мети. Виписки дозволяють отримати витяги статей (усічений текст статті). Існує параметр під назвою exintro, який можна використовувати для отримання тексту в нульовому розділі (ніяких додаткових ресурсів, таких як зображення або інформаційні поля). Ви також можете отримати витяги з більш тонкою деталізацією, такі як певна кількість символів ( обмінники ) або певна кількість пропозицій ( виразності )

Ось зразок запиту http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow та пісочна скринька API http://en.wikipedia.org/wiki/ Спеціально: ApiSandbox # action = query & prop = extracts & format = json & exintro = & title = Стек% 20Перевірка, щоб більше експериментувати з цим запитом.

Зауважте, що якщо ви хочете конкретно перший абзац, вам все-таки потрібно зробити додатковий аналіз, як було запропоновано у вибраній відповіді. Різниця тут полягає в тому, що відповідь, повернута цим запитом, коротша, ніж деякі інші запропоновані api-запити, оскільки у вас немає додаткових активів, таких як зображення у відповіді api на розбір.


62

З 2017 року Wikipedia надає API REST з кращим кешуванням. У документації ви можете знайти наступний API, який ідеально відповідає вашому використанню. (як це використовується новою функцією попереднього перегляду сторінки )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow повертає такі дані, які можуть бути використані для відображення літнього з невеликим мініатюром:

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

За замовчуванням слід переспрямувати (так що /api/rest_v1/page/summary/StackOverflowтакож працює), але це можна відключити?redirect=false

Якщо вам потрібно отримати доступ до API з іншого домену, ви можете встановити заголовок CORS за допомогою &origin=(наприклад &origin=*)

Оновлення 2019 року: API здається, що повертає більше корисної інформації про сторінку.


1
Сюди також відноситься "тип", який є чудовим, якщо вам потрібно знати, чи є те, що ви шукали, "розбірливість".
Джел Шах

1
Я отримую помилку CORS під час спроби отримати доступ до цього посилання з мого додатка на основі Angular, чи хтось може сказати мені, як вирішити це питання.
Praveen Ojha

2
Чи можливий також запит за ідентифікатором вікідату? У мене є деякі дані json, які я витягнув і виглядає як "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""ми можемо отримати витяг зараз QID?
Sourav Chatterjee

1
Чи можна це використовувати для завантаження резюме більше однієї сторінки?
сир

Що @SouravChatterjee запитував, чи можна цей API використовувати для пошуку за ідентифікаторами сторінки? Здається, немає
Абхіджіт Саркар

39

Цей код дозволяє отримати вміст першого абзацу сторінки у простому тексті.

Частини цієї відповіді походять звідси і, отже, тут . Додаткову інформацію див. У документації API MediaWiki API .

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

Але якщо здійснити пошук «коралів», результат буде чимось не обов’язковим. Чи є інший спосіб, щоб можна було підбирати лише теги р із зауваженням
Deepanshu Goyal

31

Так, є. Наприклад, якщо ви хочете отримати вміст першого розділу статті Переповнення стека , використовуйте такий запит:

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

Частини означають це:

  • format=xml: Поверніть формат результату як XML. Доступні й інші варіанти (наприклад, JSON). Це не впливає на формат самого вмісту сторінки, лише на формат даних, що додаються.

  • action=query&prop=revisions: Отримайте інформацію про версії сторінки. Оскільки ми не вказуємо, яка редакція використовується, використовується остання версія.

  • titles=Stack%20Overflow: Отримайте інформацію про сторінку Stack Overflow. Текст кількох сторінок можна отримати за один раз, якщо розділити їх назви за |.

  • rvprop=content: Поверніть зміст (або текст) версії.

  • rvsection=0: Повертайте лише вміст із розділу 0.

  • rvparse: Поверніть вміст, проаналізований як HTML.

Майте на увазі, що це повертає весь перший розділ, включаючи такі речі, як виноски ("Для інших цілей ..."), інформаційні поля або зображення.

Існує кілька бібліотек для різних мов, що полегшує роботу з API, можливо, вам буде краще, якщо ви використовували одну з них.


3
Я не хочу, щоб HTML проаналізував вміст, я просто хочу отримати "звичайний текст" (ні код wikipedia)
виблискуйте

1
API не пропонує нічого подібного. І я можу зрозуміти, чому: оскільки з точки зору API не ясно, що саме повинен містити цей "звичайний текст". Наприклад, як він повинен представляти таблиці, чи включати "[потрібне цитування]", навігаційні поля або описи зображень.
svick

2
Якщо додати &redirects=trueв кінці посилання, ви перейдете до статті призначення, якщо така існує.
eric.mitchell

14

Це код, який я зараз використовую для веб-сайту, який я створюю, який повинен отримати провідні абзаци / резюме / розділ 0 статей у Вікіпедії, і все це робиться в браузері (JavaScript на стороні клієнта) завдяки магії компанії JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Він використовує API Wikipedia, щоб отримати провідні абзаци (так званий розділ 0) в HTML, наприклад: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Потім він знімає HTML та інші небажані дані, даючи вам чистий рядок підсумків статті, якщо ви хочете, можете, трохи переробити, отримати "p" html-тег навколо провідних абзаців, але зараз є лише новий рядок персонаж між ними.

Код:

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

Ви додаєте це до сценарію на стороні клієнта? Якщо так, чи не це XSS?
Крейг

У ньому багато помилок, спробуйте це посилання зі своїм сценарієм: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht

8

Цей URL поверне резюме у форматі XML.

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

Я створив функцію для отримання опису ключового слова з 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

Ви також можете отримати такі матеріали , як перший pagagraph через DBpedia який приймає зміст Вікіпедії і створює структуровану інформацію з нього (RDF) і робить його доступним через API. API DBPedia є SPARQL (на базі RDF), але він видає JSON, і його досить легко перетворити.

Як приклад, ось надзвичайно проста бібліотека JS з назвою WikipediaJS, яка може витягувати структурований контент, включаючи перший підсумок підсумків: http://okfnlabs.org/wikipediajs/

Детальніше про це можна прочитати в цьому дописі в блозі: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

Код бібліотеки JS можна знайти тут: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Якщо ви просто шукаєте текст, який ви можете потім розділити, але не хочете використовувати API, подивіться на en.wikipedia.org/w/index.php?title=Elephant&action=raw


"готовий бути показаним на моїх веб-сайтах (так що НЕ BBCODE, або спеціального коду WIKIPEDIA!)" І це саме той
підхід

1

Мій підхід був такий (у 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 може знадобитися додаткове очищення, але це в основному все.


Краще попросити utf8 з API з & utf8 =
TomoMiha

1

Я спробував рішення @Michael Rapadas та @ Krinkle, але в моєму випадку у мене виникли проблеми з пошуку деяких статей залежно від великої літери. Як тут:

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

Примітка. Я відповів усією відповіддю exsentences=1

Мабуть, «нормалізація заголовка» працювала неправильно:

Нормалізація заголовків перетворює заголовки сторінок у їх канонічну форму. Це означає використання великих літер, заміну підкреслення пробілами та зміну простору імен на локалізовану форму, визначену для цієї вікі. Нормалізація заголовка проводиться автоматично, незалежно від того, які модулі запитів використовуються. Однак будь-який розрив кінцевих рядків у заголовках сторінки (\ n) спричинить дивну поведінку, і їх слід попередньо виключити.

Я знаю, що міг легко розібратися з проблемою написання великої літери, але також було незручність передати об’єкт масиву.

Отже, тому що я просто хотів найперший абзац добре відомого та визначеного пошуку (не ризикуючи отримати інформацію з інших статей), я зробив це так:

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

Зауважте, у цьому випадку я робив усікання limit=1

Сюди:

  1. Я можу отримати доступ до даних відповідей дуже легко.
  2. Реакція досить мала.

Але ми маємо бути обережними з приводу капіталізації нашого пошуку.

Більше інформації: https://www.mediawiki.org/wiki/API:Opensearch

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.