it-swarm-pt.tech

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

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

133
sparkle

Há uma maneira de obter toda a "seção de introdução" sem qualquer análise html! Semelhante à resposta de AnthonyS com um parâmetro explaintext 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 despojados)

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


Edit: Adicionado &redirects=1 conforme recomendado nos comentários.

182
Mike Rapadas

Há realmente um muito bom prop chamado extratos que pode ser usado com consultas projetadas especificamente para esse propósito. Os extratos permitem obter extrações de artigos (texto de artigo truncado). Existe um parâmetro chamado exintro que pode ser usado para recuperar o texto na seção zeroth (não recursos adicionais, como imagens ou infoboxes). Você também pode recuperar extrações com maior granularidade, como por um certo número de caracteres ( exchars ) ou por um determinado número de sentenças ( exsentences )

Aqui está uma consulta de exemplo 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 = extrai & formato = json & exintro = & titles = Pilha% 20Overflow para experimentar mais com esta consulta.

Por favor, note que se você quer o primeiro parágrafo especificamente você ainda precisa fazer algumas análises adicionais como 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 recursos adicionais, como imagens na resposta da API para análise.

73
AnthonyS

Desde 2017, a Wikipedia fornece uma API REST com melhor cache. Em a documentação você pode encontrar a seguinte API que se encaixa perfeitamente no seu caso de uso. (como é usado pelo novo recurso de Pré-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:

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

Por padrão, segue redirecionamentos (para que /api/rest_v1/page/summary/StackOverflow também funcione), mas isso pode ser desabilitado com ?redirect=false

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

45
lw1.at

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

Partes desta resposta vêm de aqui e assim aqui . Veja documentação da API do MediaWiki para 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.
}
39
Alexandre Vaillancourt

Sim existe. Por exemplo, se você deseja obter o conteúdo da primeira seção do artigo Stack Overflow , 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 isso:

  • format=xml: Retorna o formatador de resultado como XML. Outras opções (como JSON) estão disponíveis. Isso não afeta o formato do conteúdo da página em si, apenas o formato de dados que o contém.

  • action=query&prop=revisions: obtém informações sobre as revisões da página. Como não especificamos qual revisão, a última é 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 seus nomes por |.

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

Tenha em mente que isso retorna toda a primeira seção, incluindo itens como "hatnotes" ("Para outros usos ..."), infoboxes ou imagens.

Existem várias bibliotecas disponíveis para vários idiomas que tornam o trabalho com a API mais fácil, pode ser melhor para você se você usou uma delas.

30
svick

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

Ele usa a API da Wikipédia para obter os parágrafos iniciais (chamados de seção 0) em HTML da seguinte forma: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text&section= 0 & callback =?

Em seguida, ele retira o HTML e outros dados indesejados, fornecendo uma string limpa de um resumo do artigo. Se desejar, você pode, com alguns ajustes, obter uma tag html "p" nos parágrafos iniciais, 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
    }
});
15
01AutoMonkey

Esse URL retornará o 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');
8
Amit Garg

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

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

Você pode ler mais sobre isso neste post: 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

5
Rufus Pollock

O abstract.xml.gz dump soa como o que você quer.

2
sarnold

Eu tentei a solução @Michael Rapadas e @ Krinkle, mas no meu caso eu tive problemas em 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

Observe que trunquei a resposta com exsentences=1

Aparentemente, "normalização de 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 capitalizar o primeiro caractere, substituindo sublinhados por espaços e alterando o namespace para o formulário localizado definido para esse wiki. A normalização do título é feita automaticamente, independentemente de quais módulos de consulta são usados. No entanto, qualquer quebra de linha à direita nos títulos de página (\ n) causará um comportamento estranho e deverá ser removida primeiro.

Eu sei que poderia ter resolvido o problema de letras maiúsculas facilmente, mas havia também a inconveniência de ter que converter o objeto para um array.

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

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

Note 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 da nossa pesquisa.

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

1
gugol

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.

1
Alex

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

0
mr.user1065741