10

ウィキペディアで人の生年月日と死亡日を検索できるpythonプログラムを作成しようとしています。

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

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 から取得します。近づかなければならない気がしますが、ここから先に進む方法がわかりません。

編集

いくつかの回答の後、私は 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? それはできますが、この仕事には間違ったツールを使用しているように感じます。

4

6 に答える 6

8

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

またRequests、リクエストを作成するためのよりクリーンな API を備えた も参照してください。


RequestsBeautifulSoupおよびを使用した実際のコードは次のreとおりです。ここではおそらく最適なソリューションではありませんが、非常に柔軟で、同様の問題に対して拡張できます。

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データとを使用した@JBernardoの提案によるとmwparserfromhell、この特定のユースケースに対するより良い答え:

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
于 2012-09-03T15:31:47.587 に答える
5

1 つ目:ウィキペディア API では、 XML の代わりにJSONを使用できるため、作業がはるかに簡単になります。

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

ここでいくつかのWikiパーサーを確認してください


ここで混乱しているように思われるのは、API を使用すると特定の形式 (XML または JSON) を要求できるが、それは解析したい実際の形式のテキストの単なるコンテナーにすぎないということです。

これです: {{Birth date|df=yes|1879|3|14}}

上記のリンクで提供されているパーサーの 1 つを使用すると、それを行うことができます。

于 2012-09-03T15:43:28.430 に答える
5

まず、pywikipediaを使用します。高レベルの抽象インターフェースを介して、記事のテキスト、テンプレート パラメーターなどをクエリできます。次に、Persondataテンプレートを使用します (記事の最後を参照してください)。また、長期的には、導入に数か月かかるWikidataに興味があるかもしれませんが、ウィキペディアの記事のほとんどのメタデータを簡単にクエリできるようになります。

于 2012-09-03T19:43:23.960 に答える
1

テンプレートは現在廃止されており、代わりにpersondataウィキデータにアクセスする必要があります。ウィキデータ:データ アクセスを参照してください。2012年からの以前の(現在は廃止された)回答は次のとおりです。

あなたがすべきことは{{persondata}}、ほとんどの伝記記事に見られるテンプレートを解析することです。そのようなデータをプログラムで簡単に抽出するための既存のツールがあり、既存の知識と他の役立つ回答があれば、それを機能させることができると確信しています。

于 2012-09-04T09:25:15.300 に答える