コンテンツの概要を取得するためだけのクリーンなウィキペディアAPIはありますか?


150

ウィキペディアのページの最初の段落を取得するだけです。コンテンツはHTML形式で、ウェブサイトに表示する準備ができている必要があります(BBCODEなし、またはWIKIPEDIA特別コード!)


2
ウィキペディアはBBコードを使用せず、独自のWikiマークアップコードを使用します。
11

ウィキペディアのすべての記事で機能するわけではありません。ro.wikipedia.org/w/...
ドミトル

回答:


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

(警告が取り除かれました)

{
    "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に追加して、ページIDのリストを取得し、反復を容易にすることもできます。
Rami

wiki呼び出しからjson出力を取得し、jsonを配列$ data = json_decode($ json、true)にキャストしました。次に、を使用して「抽出」を取得しようとします$extract = current((array)$data->query->pages)->extract;。しかし、「通知:非オブジェクトのプロパティを取得しようとしています」が引き続き発生します。
シカールバンサル16年

79

この目的のために特別に設計されたクエリで使用できる、抽出と呼ばれる非常に優れたプロップがあります。抽出により、記事の抽出(切り捨てられた記事のテキスト)を取得できます。0番目のセクションのテキスト取得するために使用できるexintroというパラメーターがあります(画像や情報ボックスなどの追加のアセットはありません)。特定の数の文字(exchars)や特定の数の文(exsentences)など、より細かい粒度で抽出を取得することもできます。

ここにあるサンプルは、クエリ http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20OverflowAPIサンドボックス http://en.wikipedia.org/wiki/ Special:ApiSandbox#action = query&prop = extracts&format = json&exintro =&titles = 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
これには、「タイプ」も含まれます。これは、検索したものが「あいまいさ」がないかどうかを知る必要がある場合に優れています。
Jeel Shah、

1
AngularベースのアプリケーションからこのリンクにアクセスしようとするとCORSエラーが発生します。解決方法を誰かに教えてもらえますか。
Praveen Ojha

2
ウィキデータIDでクエリすることもできますか?"other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""抽出したjsonデータ があり、QIDで抽出を取得できますか?
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.
}

しかし、「コーラル」を検索すると、結果は不要なものになります。他に方法はありますか?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の観点から、この「プレーンテキスト」に正確に何が含まれるべきかが明確でないためです。たとえば、「[引用が必要]」、ナビゲーションボックス、または画像の説明を含めるかどうかなど、テーブルをどのように表すか。
スビック

2
&redirects=trueリンクの最後に追加すると、リンク先の記事がある場合は、そこに確実にアクセスできます。
eric.mitchell 2014

14

これは、Wikipediaの記事の最初の段落/要約/セクション0を取得する必要がある作成中のWebサイトで現在使用しているコードであり、マジックのおかげですべてブラウザー(クライアント側のJavaScript)内で実行されます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& section = 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ではありませんか?
クレイグ

多くのバグがあります。スクリプトでこのリンクを試してください: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は、ウィキペディアのコンテンツを取得し、そこから構造化情報(RDF)を作成し、APIを介してこれを利用可能にします。DBPedia APIはSPARQLの1つ(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をご覧ください。


「(!NO BBコード、またはWIKIPEDIA特別CODEので)私のウェブサイト上に表示される準備ができて、」これはまさにoppsiteある
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を要求することをお
勧めし

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

どうやら「タイトルの正規化」は正しく機能していませんでした:

タイトルの正規化は、ページタイトルを正規の形式に変換します。つまり、最初の文字を大文字にし、アンダースコアをスペースに置き換え、名前空間をそのwikiに定義されているローカライズされたフォームに変更します。タイトルの正規化は、使用されるクエリモジュールに関係なく、自動的に行われます。ただし、ページタイトルの末尾の改行(\ 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.