2012-09-03 8 views
8

私は人のための出生と死の日付のためにウィキペディアを検索できるPythonプログラムを書こうとしています。ウィキペディアの出生と死亡の日付を解析しますか?

たとえば、アルバートアインシュタインは1879年3月14日に生まれました。死亡した:1955年4月18日

は、私はこれは、限り、それが行くように働くFetch a Wikipedia article with Python

import urllib2 
opener = urllib2.build_opener() 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
infile = opener.open('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&rvsection=0&titles=Albert_Einstein&format=xml') 
page2 = infile.read() 

から始まりました。 page2はアルバート・アインシュタインのウィキペディアのページのxml表現です。

そしてこのチュートリアルでは、xml形式のページがあるので、http://www.travisglines.com/web-coding/python-xml-parser-tutorialというページがありますが、xmlから必要な情報(誕生日と死亡日)を取得する方法を理解できません。私は近くにいなければならないと感じていますが、私はここからどのように進むのか分かりません。いくつかの応答の後

EDIT

、私はBeautifulSoupをインストールしました。だから

import BeautifulSoup as BS 
soup = BS.BeautifulSoup(page2) 
print soup.getText() 
{{Infobox scientist 
| name  = Albert Einstein 
| image  = Einstein 1921 portrait2.jpg 
| caption  = Albert Einstein in 1921 
| birth_date = {{Birth date|df=yes|1879|3|14}} 
| birth_place = [[Ulm]], [[Kingdom of Württemberg]], [[German Empire]] 
| death_date = {{Death date and age|df=yes|1955|4|18|1879|3|14}} 
| death_place = [[Princeton, New Jersey|Princeton]], New Jersey, United States 
| spouse  = [[Mileva Marić]] (1903–1919)<br>{{nowrap|[[Elsa Löwenthal]] (1919–1936)}} 
| residence = Germany, Italy, Switzerland, Austria, Belgium, United Kingdom, United States 
| citizenship = {{Plainlist| 
* [[Kingdom of Württemberg|Württemberg/Germany]] (1879–1896) 
* [[Statelessness|Stateless]] (1896–1901) 
* [[Switzerland]] (1901–1955) 
* [[Austria–Hungary|Austria]] (1911–1912) 
* [[German Empire|Germany]] (1914–1933) 
* United States (1940–1955) 
}} 

はるかに近いが、私はまだこの形式でdeath_dateを返す方法を知らない:私は印刷できる段階になりましたよ。 reを使って構文解析を開始しない限り?私はそれをすることができますが、私はこの仕事に間違ったツールを使用しているように感じます。

+0

XMLパーサーはそれ以上の手助けをしません。 JBernardoの言うことを読んでください:データをjson形式でフェッチし、専用MWパーサを使用してください。 – georg

+0

私は完全なコードを '/'を使用して/使用せずに添付して、それを解析しました。 –

+0

あなたのUser-Agentによってブラウザを偽装しようとしないでください。 [ウィキメディアのユーザ - エージェントポリシー](http://meta.wikimedia.org/wiki/User-Agent_policy)によると、 "連絡先情報付きの有益なユーザエージェントの文字列"を使用する必要があります。 – svick

答えて

7

BeautifulSoupまたはlxmlなどのライブラリを使用して、応答html/xmlを解析することを検討できます。

Requestsをご覧になることもできます。これは、リクエストを作成するためのより洗練されたAPIを備えています。ここで


は間違いなく、ここでの最善の解決策RequestsBeautifulSoupreを使用して作業コードではありませんが、それは非常に柔軟であり、同様の問題のために拡張することができます。

import re 
import requests 
from bs4 import BeautifulSoup 

url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&rvsection=0&titles=Albert_Einstein&format=xml' 

res = requests.get(url) 
soup = BeautifulSoup(res.text, "xml") 

birth_re = re.search(r'(Birth date(.*?)}})', soup.revisions.getText()) 
birth_data = birth_re.group(0).split('|') 
birth_year = birth_data[2] 
birth_month = birth_data[3] 
birth_day = birth_data[4] 

death_re = re.search(r'(Death date(.*?)}})', soup.revisions.getText()) 
death_data = death_re.group(0).split('|') 
death_year = death_data[2] 
death_month = death_data[3] 
death_day = death_data[4] 

パーJSONデータとmwparserfromhellを使用したJBernardoの提案、この特定のユースケースに対するより良い答え:

import requests 
import mwparserfromhell 

url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&rvsection=0&titles=Albert_Einstein&format=json' 

res = requests.get(url) 
text = res.json["query"]["pages"].values()[0]["revisions"][0]["*"] 
wiki = mwparserfromhell.parse(text) 

birth_data = wiki.filter_templates(matches="Birth date")[0] 
birth_year = birth_data.get(1).value 
birth_month = birth_data.get(2).value 
birth_day = birth_data.get(3).value 

death_data = wiki.filter_templates(matches="Death date")[0] 
death_year = death_data.get(1).value 
death_month = death_data.get(2).value 
death_day = death_data.get(3).value 
+1

+1 BeautifulSoup。 OPが必要とするものです。 –

+1

HTML/XMLパーサーが役立つかどうかを確認するためにデータをチェックしましたか?ヒント:それは – JBernardo

+0

@JBernardoではありません。内容は同じXMLタグにあります。 JSON形式にも同じ問題があるようですが。私は、あなたが提案したパーザの1つがタグ内のデータを解析すると思いますか? –

5

最初に:ウィキペディアAPIでは、XMLの代わりにJSONを使用できます。これにより作業がはるかに簡単になります。

第2の:HTML/XMLパーサーをまったく使用する必要はありません(コンテンツはHTMLでもコンテナでも必要ありません)。解析する必要があるのは、Wikiの形式で、JSONの「リビジョン」タグ内にあります。

チェックここで混乱しているようで何here


は、APIを使用すると、特定のフォーマット(XMLまたはJSON)を要求することができますが、それがあるということですいくつかのWikiパーサはリアルタイムでいくつかのテキストのためだけのコンテナですあなたが解析したいフォーマット:

この1:上記のリンクで提供パーサの一つと{{Birth date|df=yes|1879|3|14}}

、あなたはそれを行うことができるようになります。

+0

これでJSONとして読むことができます: 'infile = opener.open( 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&rvsection=0&titles=Albert_Einstein&format=json' ) ' あなたがリンクしているWikiパーサーを見ると、XML/HTMLですがJSONは表示されていません。あなたはお勧めですか? – JBWhitmore

+0

@JBWhitmore 'json'モジュールにはPythonが付属しています。これは、解析したい実際のデータのコンテナです。このデータはXMLまたはHTMLまたはJSONではありません。これは特定のWiki形式のものです – JBernardo

+0

@JBWhitmoreこの種のデータを解析したいとします: '{{Birth date | df = yes | 1879 | 3 | 14}}'とリンクのモジュールの1つが役に立ちます。 – JBernardo

4

まず、pywikipediaを使用します。それは、ハイレベルの抽象的なインターフェイスを介して記事のテキスト、テンプレートパラメータなどを照会することができます。次に、私はPersondataテンプレート(記事の終わりに向かって見てください)と一緒に行くでしょう。また、長期的には、Wikidataに興味があるかもしれませんが、導入に数ヶ月かかるでしょうが、Wikipediaの記事のほとんどのメタデータは簡単にクエリ可能になります。

1

persondataテンプレートは廃止されました。代わりにWikidataにアクセスする必要があります。 Wikidata:Data accessを参照してください。次のように2012年からの私の以前の(現在は非推奨)の答えは:あなたが何をすべき

は、ほとんどの伝記の記事で見つけ{{persondata}}テンプレートを解析することです。あなたの既存の知識と他の有用な答えと私はあなたがその仕事をすることができると確信して、existing tools for easily extracting such data programmaticallyがあります。

+0

それは価値があるので、 Persondataは廃止予定です。このリンクには、「...これは削除されました。これからは、Wikidataに代わり、このようなデータを引用する必要があります。」 –

+0

確かに。私は私の答えを編集します。 –

関連する問題