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

124

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

  • 2
    Википедия не использует BB-код, она использует свой собственный код вики-разметки.
  • 0
    эй, ты что-нибудь нашел? Я прошел через принятый ответ ниже, но если я произнесу слово «Коралл», я получил неправильное описание / резюме, или вы использовали что-то еще для поиска?
Показать ещё 3 комментария
Теги:
wikipedia
wikipedia-api

12 ответов

169
Лучший ответ

Там есть способ получить всю секцию "intro" без какого-либо анализа html! Подобно AnthonyS ответ с дополнительным параметром explaintext, вы можете получить текст раздела intro в виде обычного текста.

запрос

Получение Qaru intro в текстовом виде:

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 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


Edit: Added &redirects=1 как рекомендовано в комментариях.

  • 26
    Настоятельно рекомендуется использовать & redirects = 1, который автоматически перенаправляет содержимое синонимов.
  • 5
    Как я могу получить информацию из этого ответа JSON, если я не знаю номера страниц. Я не могу получить доступ к массиву JSON, содержащему «extract»
Показать ещё 4 комментария
67

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

Ниже приведен пример запроса http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow и песочницу API http://en.wikipedia.org/wiki/Special:ApiSandbox#action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow, чтобы поэкспериментировать с этим запросом.

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

  • 2
    Ты бомба.
  • 0
    Что если я хочу использовать экстракт с результатом поиска 10?
38

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

Части этого ответа взяты из здесь и, таким образом, здесь. Подробнее см. Документация API MediaWiki.

// 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 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.
}
  • 0
    Да уж! Я ищу только для этого! Именно так! Все отлично, но это останавливается на первой «новой линии». Не вернуть весь текст до конца раздела
  • 9
    Конечно, ваш вопрос гласит, что мне нужно просто получить первый абзац .
Показать ещё 2 комментария
29

Да, есть. Например, если вы хотите получить содержимое первого раздела статьи Переполнение стека, используйте такой запрос:

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 не ясно, что именно должен содержать этот «простой текст». Например, как он должен представлять таблицы, включать ли «[необходимо цитирование]», навигационные блоки или описания изображений.
Показать ещё 3 комментария
27

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

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

{
  "title": "Stack Overflow",
  "displaytitle": "Stack Overflow",
  "pageid": 21721040,
  "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. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. [...]",
  "extract_html": "<p><b>Stack Overflow</b> is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. [...]",
  "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",
  "timestamp": "2018-01-30T09:21:21Z",
  "description": "website hosting questions and answers on a wide range of topics in computer programming"
}

По умолчанию он перенаправляет (так что /api/rest_v1/page/summary/StackOverflow также работает), но это может быть отключено с помощью ?redirect=false

Если вам нужно получить доступ к API из другого домена, вы можете установить заголовок CORS с &origin= (например, &origin=*)

  • 1
    Вы спасли мою жизнь
  • 0
    Это также включает в себя «тип», который отлично подходит, если вам нужно знать, имеет ли то, что вы искали, «неоднозначность».
Показать ещё 3 комментария
15

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

Он использует API Википедии, чтобы получить первые абзацы (называемые секцией 0) в формате HTML следующим образом: http://en.wikipedia.org/w/? api.php формат = & JSON усилителя; действие = синтаксический & стр = Stack_Overflow & проп = текст & раздел = 0 &? = обратный вызов

Затем он удаляет 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
    }
});
  • 0
    Вы добавляете это в сценарий на стороне клиента? Если так, разве это не XSS?
  • 0
    В нем много ошибок, попробуйте эту ссылку со своим скриптом: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
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');
  • 0
    Как получить вывод JsonP, чтобы я мог проанализировать результаты в Javascript на стороне клиента с JQuery?
5

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

2

abstract.xml.gz dump звучит как тот, который вы хотите.

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

Таким образом:

  • Я могу легко получить доступ к данным ответа.
  • Ответ довольно мал.

Но мы должны быть осторожны с капитализацией нашего поиска.

Дополнительная информация: https://www.mediawiki.org/wiki/API:Opensearch

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 может потребоваться дополнительная очистка, но в основном это.

  • 0
    Вы можете увидеть, как это работает здесь: trovawiki.altervista.org/oggi.php
  • 0
    Лучше спросить utf8 у API с & utf8 =
0

Если вы просто ищете текст, который затем можете разбить, но не хотите использовать API, посмотрите en.wikipedia.org/w/index.php?title=Elephant&action=raw

  • 0
    "готов для показа на моих сайтах (так что НИКАКОГО BBCODE или специального кода WIKIPEDIA!)" И это как раз наоборот

Ещё вопросы

Сообщество Overcoder
Наверх
Меню