Existe uma API da wikipedia limpa apenas para recuperar o resumo do conteúdo?

150

Eu preciso apenas recuperar o primeiro parágrafo de uma página da Wikipedia. O conteúdo deve estar formatado em html, pronto para ser exibido nos meus sites (portanto, NÃO BBCODE ou CÓDIGO especial WIKIPEDIA!)

brilhar
fonte
2
A Wikipedia não usa código BB, usa seu próprio código de marcação wiki.
precisa
Não funciona para todos os artigos da Wikipedia. ro.wikipedia.org/w/...
dumitru

Respostas:

205

Existe uma maneira de obter a "seção de introdução" inteira sem nenhuma análise de html! Semelhante à resposta de AnthonyS com um explaintextparâmetro adicional , você pode obter o texto da seção de introdução em texto simples.

Inquerir

Obtendo a introdução do Stack Overflow em texto simples:

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

Resposta JSON

(avisos retirados)

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

Documentação: API: query / prop = extractos


Editar: adicionado &redirects=1conforme recomendado nos comentários.

Mike Rapadas
fonte
28
É muito recomendável usar & redirecionamentos = 1 que redireciona automaticamente para o conteúdo de sinônimos
joecks
6
Como posso obter informações dessa resposta JSON se não souber o número das páginas. Eu não posso variedade acesso JSON contendo "extrato"
Laurynas G
@LaurynasG Você pode converter o objeto para uma matriz e, em seguida, agarrá-lo como este: $ extrato = corrente ((array) $ json_query-> query-> páginas) -> extrato
MarcGuay
@LaurynasG, @MarcGuay Você também pode adicionar ` indexpageids como um parâmetro ao URL para obter uma lista de pageids para facilitar a iteração.
Rami
Eu peguei a saída json da chamada da wiki e, em seguida, elencei o json para colocar $ data = json_decode ($ json, true). Então eu tento obter o 'extrato' usando $extract = current((array)$data->query->pages)->extract;. mas "Aviso: tentar obter propriedade de não-objeto" continua chegando.
Shikhar bansal
79

Na verdade, existe um suporte muito bom chamado extratos que pode ser usado com consultas criadas especificamente para esse fim. As extrações permitem obter extrações de artigos (texto truncado do artigo). Há um parâmetro chamado exintro que pode ser usado para recuperar o texto na seção zeroth (nenhum recurso adicional, como imagens ou caixas de informações). Você também pode recuperar extrações com granularidade mais fina, como por um determinado número de caracteres ( exchars ) ou por um determinado número de frases ( exsentências )

Aqui está um exemplo de consulta http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow e a sandbox da API http://en.wikipedia.org/wiki/ Especial: ApiSandbox # action = query & prop = extratos & formato = json & exintro = & title = Stack% 20Overflow para experimentar mais com essa consulta.

Observe que, se você deseja o primeiro parágrafo especificamente, ainda precisa fazer algumas análises adicionais, conforme sugerido na resposta escolhida. A diferença aqui é que a resposta retornada por essa consulta é mais curta do que algumas das outras consultas da API sugeridas, porque você não possui ativos adicionais, como imagens na resposta da API para análise.

AnthonyS
fonte
62

Desde 2017, a Wikipedia fornece uma API REST com melhor cache. Na documentação, você pode encontrar a seguinte API que se encaixa perfeitamente no seu caso de uso. (como é usado pelo novo recurso Visualizações de página )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow retorna os seguintes dados que podem ser usados ​​para exibir um verão com uma pequena miniatura:

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

Por padrão, segue os redirecionamentos (para que /api/rest_v1/page/summary/StackOverflowtambém funcionem), mas isso pode ser desativado com?redirect=false

Se você precisar acessar a API de outro domínio, poderá definir o cabeçalho CORS com &origin=(por exemplo &origin=*)

Atualização 2019: a API parece retornar informações mais úteis sobre a página.

lw1.at
fonte
1
Isso também inclui "tipo", que é excelente se você precisar saber se o que você pesquisou tem uma "desambiguação".
Jeel Shah
1
Estou recebendo erro CORS ao tentar acessar este link do meu aplicativo baseado em Angular, alguém pode me dizer como resolver isso.
Praveen Ojha
2
É possível também consultar por um ID da wikidata? Eu tenho alguns dados do json que extraí, que parecem: "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Podemos obter a extração agora pelo QID?
Sourav Chatterjee
1
Isso pode ser usado para carregar o resumo de mais de uma página?
cheesus
O que o @SouravChatterjee pediu, essa API pode ser usada para pesquisar por IDs de página? Parece que não
Abhijit Sarkar 19/06
39

Este código permite recuperar o conteúdo do primeiro parágrafo da página em texto sem formatação.

Partes desta resposta vêm daqui e, portanto, aqui . Consulte a documentação da API do MediaWiki para obter mais informações.

// 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.
}
Vaillancourt
fonte
Mas se você pesquisar "coral", o resultado será algo não obrigatório. Existe alguma outra maneira, de modo que apenas as tags p com smmary pode ser pego
Deepanshu Goyal
31

Sim existe. Por exemplo, se você deseja obter o conteúdo da primeira seção do artigo Estouro de pilha , use uma consulta como esta:

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

As partes significam o seguinte:

  • format=xml: Retorne o formatador de resultados como XML. Outras opções (como JSON) estão disponíveis. Isso não afeta o formato do conteúdo da página, apenas o formato dos dados anexos.

  • action=query&prop=revisions: Obtenha informações sobre as revisões da página. Como não especificamos qual revisão, a mais recente é usada.

  • titles=Stack%20Overflow: Obtenha informações sobre a página Stack Overflow. É possível obter o texto de mais páginas de uma só vez, se você separar os nomes deles |.

  • rvprop=content: Retorna o conteúdo (ou texto) da revisão.

  • rvsection=0: Retorna apenas o conteúdo da seção 0.

  • rvparse: Retorna o conteúdo analisado como HTML.

Lembre-se de que isso retorna a primeira seção inteira, incluindo notas de rodapé ("Para outros usos ..."), infoboxes ou imagens.

Existem várias bibliotecas disponíveis para vários idiomas que facilitam o trabalho com a API; pode ser melhor para você se você tiver usado uma delas.

svick
fonte
3
Eu não quero o conteúdo HTML ad analisado, eu só quero pegar o "texto simples" (nem código wikipedia)
brilho
1
A API não oferece nada parecido. E eu posso entender o porquê: porque, da perspectiva da API, não está claro o que exatamente esse "texto simples" deve conter. Por exemplo, como ele deve representar tabelas, incluindo "[citação necessário]", caixas de navegação ou descrições de imagens.
svick
2
A adição &redirects=trueao final do link garante que você chegue ao artigo de destino, se houver algum.
Eric.mitchell
14

Este é o código que estou usando agora para um site que estou criando que precisa obter os parágrafos / resumo / seção 0 dos artigos da Wikipedia, e tudo é feito no navegador (javascript do lado do cliente) graças à magia de JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

Ele usa a API da Wikipedia para obter os parágrafos principais (chamados de seção 0) em HTML, assim: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Em seguida, retira o HTML e outros dados indesejados, fornecendo uma sequência limpa de um resumo do artigo, se você quiser, com um pouco de ajustes, obter uma tag html "p" nos parágrafos principais, mas agora há apenas uma nova linha personagem entre eles.

Código:

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
    }
});
01AutoMonkey
fonte
Você adiciona isso ao script do lado do cliente? Se sim, esse não é o XSS?
craig
Ele tem muitos bugs, tente este link com o script: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht
8

Este URL retornará um resumo no formato xml.

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

Eu criei uma função para buscar a descrição de uma palavra-chave da 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');
Amit Garg
fonte
5

Você também pode obter conteúdo, como o primeiro parágrafo, via DBPedia, que pega o conteúdo da Wikipedia e cria informações estruturadas a partir dele (RDF) e o disponibiliza por meio de uma API. A API DBPedia é uma SPARQL (baseada em RDF), mas gera JSON e é muito fácil de quebrar.

Como exemplo, aqui está uma biblioteca JS super simples chamada WikipediaJS que pode extrair conteúdo estruturado, incluindo um primeiro parágrafo de resumo: http://okfnlabs.org/wikipediajs/

Você pode ler mais sobre isso nesta postagem do blog: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

O código da biblioteca JS pode ser encontrado aqui: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js

Rufus Pollock
fonte
1

Se você está apenas procurando o texto que pode separar, mas não deseja usar a API, dê uma olhada em en.wikipedia.org/w/index.php?title=Elephant&action=raw

mr.user1065741
fonte
"pronto para ser exibido em meus sites (portanto, NÃO CÓDIGO especial BBCODE ou WIKIPEDIA!)" E este é exatamente o oppsite
bluewhile
1

Minha abordagem foi a seguinte (em 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 pode precisar de mais limpeza, mas é basicamente isso.

Alex
fonte
É melhor perguntar utf8 da API com & utf8 =
TomoMiha
1

Tentei as soluções @ Michael Rapadas e @ Krinkle, mas no meu caso tive problemas para encontrar alguns artigos, dependendo da capitalização. Como aqui:

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

Nota: eu truncou a resposta com exsentences=1

Aparentemente, a "normalização do título" não estava funcionando corretamente:

A normalização de títulos converte os títulos das páginas em sua forma canônica. Isso significa colocar em maiúscula o primeiro caractere, substituindo sublinhados por espaços e alterando o namespace para o formulário localizado definido para esse wiki. A normalização de títulos é feita automaticamente, independentemente de quais módulos de consulta são usados. No entanto, qualquer quebra de linha à direita nos títulos das páginas (\ n) causará um comportamento estranho e eles deverão ser removidos primeiro.

Eu sei que poderia ter resolvido o problema de maiúsculas facilmente, mas também havia o inconveniente de ter que converter o objeto em uma matriz.

Então, como eu realmente queria o primeiro parágrafo de uma pesquisa bem conhecida e definida (sem risco de obter informações de outros artigos), fiz o seguinte:

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

Observe que neste caso eu fiz o truncamento com limit=1

Deste jeito:

  1. Eu posso acessar os dados de resposta com muita facilidade.
  2. A resposta é bem pequena.

Mas temos que continuar sendo cuidadosos com a capitalização de nossa pesquisa.

Mais informações: https://www.mediawiki.org/wiki/API:Opensearch

Relojoeiro
fonte