2012-09-03 24 views
8

मैं एक पायथन प्रोग्राम लिखने की कोशिश कर रहा हूं जो लोगों के लिए जन्म और मृत्यु तिथियों के लिए विकिपीडिया खोज सकता है।विकिपीडिया से पार्स जन्म और मृत्यु तिथियां?

उदाहरण के लिए, अल्बर्ट आइंस्टीन का जन्म हुआ: 14 मार्च 1879; मर गया: 18 अप्रैल 1955

मैं 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 प्रारूप में पृष्ठ है ... 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 के साथ चीजों को पार्स करना शुरू नहीं करता? मैं ऐसा कर सकता हूं, लेकिन मुझे लगता है कि मैं इस नौकरी के लिए गलत उपकरण का उपयोग कर रहा हूं।

+0

एक एक्सएमएल पार्सर आपकी मदद नहीं करेगा। जेबीर्नर्डो क्या कहता है पढ़ें: जेसन प्रारूप में डेटा लाएं और एक समर्पित मेगावाट पार्सर का उपयोग करें। – georg

+0

मैंने इसे पार करने के लिए 're' का उपयोग किए बिना/बिना पूर्ण कोड संलग्न किया है। –

+0

कृपया, अपने उपयोगकर्ता-एजेंट द्वारा ब्राउज़र का प्रतिरूपण करने का प्रयास न करें। [विकिमीडिया उपयोगकर्ता-एजेंट नीति] के अनुसार (http://meta.wikimedia.org/wiki/User-Agent_policy), आपको "संपर्क जानकारी के साथ एक सूचनात्मक उपयोगकर्ता-एजेंट स्ट्रिंग" का उपयोग करना चाहिए। सुंदर सूप के लिए – svick

उत्तर

7

प्रतिक्रिया एचटीएमएल/एक्सएमएल को पार्स करने के लिए आप BeautifulSoup या lxml जैसी लाइब्रेरी का उपयोग करने पर विचार कर सकते हैं।

आप Requests पर भी एक नज़र डालना चाहते हैं, जिसमें अनुरोध करने के लिए एक बहुत क्लीनर एपीआई है।


यहाँ यहाँ Requests, BeautifulSoup और 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] 

प्रति जेएसओएन डेटा और 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 
+1

+1। यही ओपी की जरूरत है। –

+1

क्या आपने यह देखने के लिए डेटा भी चेक किया था कि कोई HTML/XML पार्सर मदद करेगा या नहीं? संकेत: यह – JBernardo

+0

@JBernardo नहीं होगा आप सही हैं, सामग्री एक ही एक्सएमएल टैग में हैं। हालांकि ऐसा लगता है कि जेएसओएन प्रारूप में एक ही समस्या है। मुझे लगता है कि आपके द्वारा सुझाए गए पार्सर में से एक टैग के अंदर डेटा को पार्स करेगा? –

5

पहला: विकिपीडिया एपीआई एक्सएमएल के बजाय JSON के उपयोग की अनुमति देता है और इससे चीजों को और अधिक आसान बना दिया जाएगा।

दूसरा: HTML/XML पार्सर्स का उपयोग करने की कोई आवश्यकता नहीं है (सामग्री HTML नहीं है और न ही कंटेनर होना आवश्यक है)। आपको जेएसओएन के "संशोधन" टैग के अंदर यह विकी प्रारूप का विश्लेषण करने की आवश्यकता है।

चेक कुछ विकी पारसर्स here


यहाँ क्या भ्रमित किया जा रहा है कि एपीआई आप एक निश्चित प्रारूप (XML या JSON) का अनुरोध करने की अनुमति देता है, लेकिन वह है सिर्फ असली में कुछ पाठ के लिए एक कंटेनर है प्रारूप आप पार्स करने के लिए करना चाहते हैं:

यह एक: {{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') ' आपके द्वारा लिंक किए गए विकी पार्सर्स को देखते हुए, मुझे लगता है कि एक्सएमएल/एचटीएमएल है लेकिन कोई JSON सूचीबद्ध नहीं है। क्या आपके पास एक अनुशंसित है? – JBWhitmore

+0

@ जेबी व्हाटमोर 'जेसन' मॉड्यूल पायथन के साथ आता है। यह ** वास्तविक ** डेटा के लिए एक कंटेनर है जिसे आप पार्स करना चाहते हैं। यह डेटा एक्सएमएल या एचटीएमएल या जेएसओएन में नहीं है। यह कुछ विशिष्ट विकी प्रारूप – JBernardo

+0

@JBWitmore में है, आप इस तरह के डेटा को पार्स करना चाहते हैं: '{{जन्म तिथि | df = yes | 1879 | 3 | 14}} 'और लिंक में से एक मॉड्यूल आपकी मदद करेगा। – JBernardo

4

सबसे पहले, pywikipedia का उपयोग करें। यह आपको एक उच्च स्तरीय सार इंटरफ़ेस के माध्यम से आलेख पाठ, टेम्पलेट पैरामीटर आदि से पूछताछ करने की अनुमति देता है। दूसरा, मैं Persondata टेम्पलेट के साथ जाऊंगा (लेख के अंत की ओर देखो)। साथ ही, लंबी अवधि में, आपको Wikidata में रुचि हो सकती है, जिसमें पेश करने के लिए कई महीने लगेंगे, लेकिन यह आसानी से पूछताछ योग्य विकिपीडिया लेखों में अधिकतर मेटाडेटा बनाएगा।

1

persondata टेम्पलेट अब बहिष्कृत है, और आपको इसके बजाय विकिडाटा तक पहुंचना चाहिए। Wikidata:Data access देखें।

आपको क्या करना चाहिए सबसे जीवनी आलेखों में मिल {{persondata}} टेम्पलेट पार्स करने के लिए है: मेरी पहले (अब हटा दिया गया) 2012 से जवाब इस प्रकार थी। आपके मौजूदा ज्ञान और अन्य उपयोगी उत्तरों के साथ existing tools for easily extracting such data programmatically हैं, मुझे यकीन है कि आप यह काम कर सकते हैं।

+0

को पार्स करने का प्रयास क्यों करेगा, इसके लिए यह किसी के लिए एक क्लिक को बाद में क्लिक करता है, Persondata अब बहिष्कृत किया प्रतीत होता है। लिंक कहता है कि, "... अब हटा दिया गया है। अब से, इस तरह के डेटा को उद्धरण के साथ, विकिडाटा के बजाय जोड़ा जाना चाहिए।" वास्तव में –

+0

। मैं अपना जवाब संपादित करूंगा। –