컨텐츠 요약 검색을위한 깨끗한 Wikipedia API가 있습니까?


150

Wikipedia 페이지의 첫 번째 단락 만 검색하면됩니다. 콘텐츠는 html 형식이어야하며 내 웹 사이트에 표시 할 준비가되어 있어야합니다 (BBCODE 또는 WIKIPEDIA 특수 코드 없음).


2
Wikipedia는 BB 코드를 사용하지 않고 자체 위키 마크 업 코드를 사용합니다.
svick

모든 Wikipedia 기사에서 작동하지는 않습니다. ro.wikipedia.org/w/…
dumitru

답변:


205

html 파싱없이 전체 "소개 섹션"을 얻는 방법이 있습니다! 추가 매개 변수 가있는 AnthonyS의 답변 과 유사하게 explaintext소개 섹션 텍스트를 일반 텍스트로 얻을 수 있습니다.

질문

일반 텍스트로 스택 오버플로 소개하기 :

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


편집 : &redirects=1의견에 권장대로 추가 되었습니다.


28
동의어의 내용으로 자동 리디렉션되는 & redirects = 1 을 사용하는 것이 좋습니다.
joecks

6
페이지 번호를 모르는 경우이 JSON 응답에서 정보를 얻는 방법은 무엇입니까? "추출"이 포함 된 JSON 배열에 액세스 할 수 없습니다
Laurynas G

@LaurynasG 객체를 배열로 캐스트 한 다음 다음과 같이 잡을 수 있습니다 : $ extract = current ((array) $ json_query-> query-> pages)-> extract
MarcGuay

@LaurynasG, @ MarcGuay`indexpageids 를 URL에 매개 변수로 추가 하여 더 쉬운 반복을 위해 pageid 목록을 얻을 수 있습니다.
Rami

위키 호출에서 json 출력을 얻은 다음 json을 $ data = json_decode ($ json, true) 배열로 캐스팅했습니다. 그런 다음을 사용하여 '추출물'을 얻으려고합니다 $extract = current((array)$data->query->pages)->extract;. 그러나 "주의 사항 : 비 객체의 재산을 얻으려고 노력하고있다"는 계속되고있다.
shikhar bansal 2016 년

79

아주 좋은 실제로이 소품 라는 추출물 이 목적을 위해 특별히 설계된 쿼리와 함께 사용할 수 있습니다. 추출을 사용하면 기사 추출 (잘린 기사 텍스트)을 얻을 수 있습니다. exintro 라는 매개 변수가 있는데 , 이는 0 번째 섹션에서 텍스트검색하는 데 사용할 수 있습니다 (이미지 또는 정보 상자와 같은 추가 자산 없음). 특정 문자 수 ( exchars ) 또는 특정 수의 문장 ( exsentences ) 과 같이 세분화 된 추출을 검색 할 수도 있습니다.

다음은 샘플 쿼리 http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20OverflowAPI 샌드 박스 http://en.wikipedia.org/wiki/ 특수 : ApiSandbox # action = query & prop = extracts & format = json & exintro = & titles = Stack % 20 이 쿼리를 더 실험하기위한 오버플

첫 번째 단락을 구체적으로 원한다면 선택한 답변에 제안 된대로 추가 구문 분석을 수행해야합니다. 차이점은이 쿼리에서 반환하는 응답이 구문 분석 할 API 응답의 이미지와 같은 추가 자산이 없기 때문에 제안 된 다른 API 쿼리 중 일부보다 짧다는 것입니다.


62

2017 년부터 Wikipedia는 더 나은 캐싱을 갖춘 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
여기에는 검색 한 내용에 "명백 함"이 있는지 알아야하는 경우 "유형"이 포함됩니다.
Jeel Shah

1
Angular 기반 응용 프로그램 에서이 링크에 액세스하려고 할 때 CORS 오류가 발생하여 누구나 해결 방법을 알려줄 수 있습니다.
Praveen Ojha

2
wikidata ID로 쿼리 할 수 ​​있습니까? QTC로 "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""추출을 얻을 수 있습니까?
Sourav Chatterjee

1
둘 이상의 페이지 요약을로드하는 데 사용할 수 있습니까?
cheesus

@SouravChatterjee가 요청한 내용은이 API를 사용하여 페이지 ID별로 검색 할 수 있습니까? 안 보인다
Abhijit Sarkar

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

그러나 "coral"을 검색하면 결과가 필요하지 않습니다. smmary가있는 p 태그 만 선택할 수 있도록 다른 방법이 있습니까?
Deepanshu Goyal

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의 관점에서이 "일반 텍스트"에 정확히 무엇이 포함되어 있는지 명확하지 않기 때문입니다. 예를 들어, "[citation needed]", 탐색 상자 또는 이미지 설명을 포함할지 여부를 표로 나타내는 방법은 무엇입니까?
svick

2
&redirects=true링크의 끝에 추가 하면 대상 기사 (있는 경우)에 도달 할 수 있습니다.
eric.mitchell

14

이것은 내가 Wikipedia 기사의 주요 단락 / 요약 / 섹션 0을 가져와야하는 웹 사이트에 지금 사용중인 코드이며, magick 덕분에 브라우저 (클라이언트 측 자바 스크립트)에서 모두 수행됩니다. JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

다음과 같이 Wikipedia API를 사용하여 HTML에서 주요 단락 (섹션 0)을 가져옵니다. 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가 아닌가요?
craig

: 그것은 버그 많이, 스크립트와이 링크 시도가 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를 통해 첫 번째 pagagraph와 같은 컨텐츠를 얻을 수 있습니다. DBPedia 는 Wikipedia 컨텐츠를 가져 와서 구조화 된 정보 (RDF)를 작성하여 API를 통해 사용할 수있게합니다. DBPedia API는 SPARQL API (RDF 기반)이지만 JSON을 출력하므로 랩핑이 매우 쉽습니다.

예를 들어, 요약 첫 번째 단락을 포함하여 구조화 된 컨텐츠를 추출 할 수있는 WikipediaJS라는 매우 간단한 JS 라이브러리가 있습니다. 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 특수 코드는 없습니다!") 이것은 정확히
oppsite입니다

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.