web-dev-qa-db-ja.com

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

Wikipediaページの最初の段落を取得するだけです。コンテンツはhtml形式である必要があり、ウェブサイトに表示できる状態になっている必要があります(BBCODEやWIKIPEDIAの特別なコードはありません!)

133
sparkle

HTMLを解析せずに「イントロセクション」全体を取得する方法があります。 AnthonySの answer に追加の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を追加しました。

182
Mike Rapadas

実際には、非常に素晴らしいpropというextractsこの目的のために特別に設計されたクエリで使用できます。抽出により、記事の抽出(切り捨てられた記事テキスト)を取得できます。 exintroというパラメーターがあり、これを使用して番目のセクションのテキストを取得(画像やインフォボックス)。特定の文字数(exchars)または特定の数の文(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クエリの一部よりも短いことです。

73
AnthonyS

2017年以降、Wikipediaは REST API を提供し、キャッシュを改善しています。 ドキュメント には、ユースケースに完全に適合する次のAPIがあります。 (新しい Page Previews 機能で使用されるため)

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にアクセスする必要がある場合は、&Origin=でCORSヘッダーを設定できます(例:&Origin=*

45
lw1.at

このコードを使用すると、ページの最初の段落のコンテンツをプレーンテキストで取得できます。

この答えの一部は、 here に由来し、したがって here に由来します。詳細については、 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.
}

はいあります。たとえば、記事の最初のセクション 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の操作を容易にするさまざまな言語用のライブラリがいくつかありますが、そのうちの1つを使用する方がよい場合があります。

30
svick

これは、ウィキペディアの記事の主要な段落/要約/セクション0を取得する必要がある私が作成しているウェブサイトのために今使用しているコードであり、すべてmagickのおかげでブラウザ(クライアント側の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
    }
});
15
01AutoMonkey

この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');
8
Amit Garg

DBPedia を介して最初のパガグラフなどのコンテンツを取得することもできます。これは、Wikipediaコンテンツを取得し、そこから構造化情報(RDF)を作成し、APIを介して利用可能にします。 DBPedia APIはSPARQLのもの(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

5
Rufus Pollock

abstract.xml.gz dump はあなたが望むもののように聞こえます。

2
sarnold

@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

1
gugol

私のアプローチは次のとおりでした(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ではさらにクリーニングが必要になる場合がありますが、基本的にはこれで終わりです。

1
Alex

分割できるがAPIを使用したくないテキストを探している場合は、en.wikipedia.org/w/index.php?title = Elephant&action = rawをご覧ください。

0
mr.user1065741