web-dev-qa-db-ja.com

ウィキペディアの情報ボックスから情報を抽出する方法は?

<ウィキペディアの記事>にこの派手な infobox があります。 <this field and that>の値を取得するにはどうすればよいですか?

18
Tgr

間違った方法:HTMLを解析しようとしています

(cURL/jQuery/file_get_contents/requests/wget/ more jQuery )を使用して記事のHTML記事コードをフェッチし、DOMパーサーを使用してtable.infobox tr[3] td/ se正規表現

これは実際、ほとんどの場合、本当に悪い考えです。ウィキペディアのHTMLコードは特に解析に適していません(特に手書きのテンプレートのシステムである情報ボックス)。正確な構造は情報ボックスごとに変わり、情報ボックスの構造は時間の経過とともに変わる可能性があります。また、国際化など、他の方法で利用できるいくつかの機能を見逃す可能性があります。

他の間違った方法:ウィキテキストを解析しようとする

一見すると、いくつかの記事のウィキテキストは、情報ボックスの非常に単純な表現のように見えます。

{{ Infobox Foo
| param1 = bar
| param2 = 123
...

実際には、そうではありません。テンプレートは「再帰的」であるため、param1 = {{convert|10|km|mi}}のようなものに遭遇する可能性があります。テンプレートパラメータには、複雑なウィキテキストまたはHTMLマークアップが含まれる場合があります。一部のパラメーターが記事のウィキテキストから欠落していて、テンプレートによってサブページまたは他のデータリポジトリからフェッチされている可能性があります。独自のパラメーターを持つ他のテンプレートが含まれている場合、パラメーターの開始位置と終了位置を見つけるだけでは簡単な作業ではない可能性があります。

理想的な方法:構造化されたデータソースを使用する

ウィキペディアの情報ボックスに含まれる情報を構造化された形式で提供するさまざまなプロジェクトがあります。 2つの大きなものはウィキデータとDBpediaです。

Wikidata は、構造化データを含むナレッジベースを構築するためのプロジェクトです。ウィキペディアを構築したのと同じ世界的な運動によって維持されているため、情報は移動中です。これは手動のプロセスであるため、ウィキペディアのすべての情報がウィキデータを介して利用できるわけではありません。一方、ウィキデータにはあるがウィキペディアにはない情報がたくさんあります。記事のウィキデータページを見つけて、記事ページの左側のツールバーにあるウィキデータアイテムリンクをたどると、そこに含まれる情報を確認できます。プログラムで、 wbgetentities APIモジュール( サンドボックス概念の説明 )を使用してウィキデータ情報にアクセスできます。 wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=Albert_EinsteinSPARQLエンドポイントデータベースダンプ 、および [〜#〜] php [〜#〜]Java および Python

DBPedia は、ウィキペディアの情報ボックス情報を自動化された方法で収集し、構造化された形式で公開するプロジェクトです。ウィキペディアの記事のDBPediaページは、http://dbpedia.org/page/<Wikipedia article name>に移動すると見つかります。例: http://dbpedia.org/page/Albert_Einstein 。多くのデータ形式、ダンプ、 SPARQLエンドポイント および 他のさまざまなもの があります。

間違った方法が正しく行われた

必要な情報がウィキデータまたはDBpediaから入手できない場合でも、情報ボックスからデータを抽出する半構造化された方法があります。 HTMLベースの抽出の場合、ウィキペディアの RESTコンテンツAPI (例 https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein )を使用できます。 よりリッチでセマンティックなHTML 通常の記事ページで使用されているものよりも、テンプレート構造に関する情報を保持します。

または、ウィキテキストから始めて、より単純なクライアント側を使用して構文ツリーに解析することもできます mwparserfromhell Pythonモジュール( docs )またはより強力な Parsoid JS API これはWikipedia RESTコンテンツサービスと相互作用します。

ウィキテキストから情報ボックスのコンテンツを抽出しようとする高レベルのPythonライブラリは wptools です。

34
Tgr