Существует ли чистый API Википедии только для получения краткого содержания?


150

Мне нужно просто получить первый абзац страницы в Википедии. Контент должен быть в формате html, готов к отображению на моих сайтах (так что НИКАКОГО BBCODE или специального кода WIKIPEDIA!)


2
Википедия не использует BB-код, она использует свой собственный код вики-разметки.
svick

Это не работает для каждой статьи в Википедии. ro.wikipedia.org/w/…
dumitru

Ответы:


205

Есть способ получить весь «вводный раздел» без разбора html! Подобно ответу AnthonyS с дополнительным explaintextпараметром, вы можете получить текст вступительного раздела в виде простого текста.

запрос

Получение вступления Stack Overflow в виде простого текста:

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

JSON Response

(предупреждения сняты)

{
    "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: query / prop = extracts


Изменить: добавлено, &redirects=1как рекомендуется в комментариях.



6
Как я могу получить информацию из этого ответа JSON, если я не знаю номер страницы. Я не могу получить доступ к массиву JSON, содержащему «extract»
Laurynas G

@LaurynasG Вы можете привести объект к массиву и затем захватить его следующим образом: $ extract = current ((array) $ json_query-> query-> pages) -> extract
MarcGuay

@LaurynasG, @MarcGuay Вы также можете добавить ` indexpageids в качестве параметра к URL-адресу, чтобы получить список страниц для упрощения итерации.
Рами

Я получил вывод json из вики-вызова, а затем преобразовал json в массив $ data = json_decode ($ json, true). Затем я пытаюсь получить «извлечение» с помощью $extract = current((array)$data->query->pages)->extract;. но «Замечание: попытка получить свойство не-объекта» продолжает появляться.
Шихар Бансал

79

На самом деле есть очень хорошая опора, называемая выдержками, которая может использоваться с запросами, разработанными специально для этой цели. Выдержки позволяют получить выдержки из статьи (усеченный текст статьи). Существует параметр exintro, который можно использовать для получения текста в нулевом разделе (без дополнительных ресурсов, таких как изображения или информационные поля). Вы также можете извлечь фрагменты с более высокой степенью детализации, например, с помощью определенного количества символов ( exchars ) или определенного количества предложений ( exsences )

Вот пример запроса 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 = Stack% 20Overflow, чтобы больше экспериментировать с этим запросом.

Обратите внимание, что если вы хотите первый абзац специально, вам все равно нужно выполнить дополнительный анализ, как указано в выбранном ответе. Разница в том, что ответ, возвращаемый этим запросом, короче, чем некоторые другие предложенные запросы API, потому что у вас нет дополнительных ресурсов, таких как изображения, в ответе API для анализа.


62

С 2017 года Википедия предоставляет REST API с улучшенным кэшированием. В документации вы можете найти следующий 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, может кто-нибудь сказать мне, как решить эту проблему.
Правин Ойха

2
Можно ли также сделать запрос по идентификатору викиданных? У меня есть некоторые извлеченные данные JSON, которые выглядят так: "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Можем ли мы получить извлечение по QID?
Сурав Чаттерджи

1
Может ли это использоваться для загрузки сводки более чем на одну страницу?
cheesus

Что попросил @SouravChatterjee, можно ли использовать этот API для поиска по идентификаторам страниц? Кажется нет
Абхиджит Саркар

39

Этот код позволяет извлекать содержимое первого абзаца страницы в виде обычного текста.

Части этого ответа приходят отсюда и, следовательно, сюда . См. Документацию 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.
}

Но если вы будете искать «коралл», результат будет чем-то не обязательным. Есть ли другой способ, так что только р метку с smmary можно подхватить
Deepanshu Гоял

31

Да, есть. Например, если вы хотите получить содержимое первого раздела статьи Stack Overflow , используйте запрос, подобный следующему:

http://en.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&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, я просто хочу , чтобы получить «обычный текст» (ни код википедии)
искрится

1
API не предлагает ничего подобного. И я могу понять почему: потому что с точки зрения API не ясно, что именно должен содержать этот «простой текст». Например, как он должен представлять таблицы, включать ли «[необходимо цитирование]», навигационные блоки или описания изображений.
svick

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

14

Это код, который я сейчас использую для веб-сайта, который я делаю, и который должен получить первые абзацы / резюме / раздел 0 из статей Википедии, и все это делается в браузере (javascript на стороне клиента) благодаря магии JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

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

Затем он удаляет HTML и другие нежелательные данные, давая вам чистую строку сводки статьи, если вы хотите, с небольшой настройкой, получить HTML-тег «p» вокруг первых абзацев, но сейчас есть только новая строка характер между ними.

Код:

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

Я создал функцию для получения описания ключевого слова из Википедии.

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

Вы также можете получить контент, такой как первый пагаграф, через DBPedia, который берет контент Википедии и создает из него структурированную информацию (RDF) и делает ее доступной через API. DBPedia API - это 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!)" И это как раз наоборот
bluewhile

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.