2009-09-24 14 views
29

क्या पाइथन में HTTP डेट-स्ट्रिंग का विश्लेषण करने का कोई आसान तरीका है? the standard के अनुसार, HTTP दिनांक तारों को प्रारूपित करने के कई तरीके हैं; विधि इसे संभालने में सक्षम होना चाहिए।मैं पाइथन में HTTP दिनांक-स्ट्रिंग का विश्लेषण कैसे करूं?

दूसरे शब्दों में, मैं "बुध, 23 सितंबर 200 9 22:29:29 जीएमटी" जैसे एक स्ट्रिंग को एक पायथन समय-संरचना में परिवर्तित करना चाहता हूं।

उत्तर

38
>>> import email.utils as eut 
>>> eut.parsedate('Wed, 23 Sep 2009 22:15:29 GMT') 
(2009, 9, 23, 22, 15, 29, 0, 1, -1) 

आप एक datetime.datetime वस्तु चाहते हैं, आप कर सकते हैं:

def my_parsedate(text): 
    return datetime.datetime(*eut.parsedate(text)[:6]) 
+5

हाँ, पार्सडेट का शायद सबसे अच्छा समझौता है, हालांकि इसकी "सहिष्णु आरएफसी 2822 पार्सिंग" आरएफसी 2616'2 मांग के साथ 100% संगत नहीं है "- उदाहरण के लिए, आरएफसी 850 प्रारूप पर महाकाव्य विफल दो-अंकों के वर्षों के साथ, जैसे 'रविवार, 06-नवंबर-9 4 08:49:37 जीएमटी', फिर भी 2616 का कहना है कि एक ग्राहक आरएफसी 850 तिथियों (श्वास) को पार्स करने में सक्षम होना चाहिए। –

+0

ईमेल। उपयोग करता है ..parsedate पर्याप्त लगता है, धन्यवाद। लेकिन यह भ्रमित है कि इसे कभी-कभी ईमेल.टिल, और कभी-कभी ईमेल कहा जाता है। उपयोग करता है। मुझे लगता है कि ईमेल। संस्करण का उपयोग एक पुराना विरासत संस्करण है जिसे हटा दिया गया है (?) –

+1

'email.utils.parsedate ईमेल है। उपयोग करता है। Msgstr" ऐसा लगता है कि * यू * टाइल एक आलसी लोडर है। – jfs

2
>>> import datetime 
>>> datetime.datetime.strptime('Wed, 23 Sep 2009 22:15:29 GMT', '%a, %d %b %Y %H:%M:%S GMT') 
datetime.datetime(2009, 9, 23, 22, 15, 29) 
+2

यह केवल एक प्रारूप को संभालेगा! – Agos

+0

हां, और किसी भी प्रारूप को संभालने के लिए विस्तार करना काफी आसान है। जबकि 'email.utils.parse' अधिक मजबूत है, यह भी कम पारदर्शी है। – SilentGhost

+5

% एक लोकेल निर्भर है इसलिए आमतौर पर – stach

1
httplib.HTTPMessage(filehandle).getdate(headername) 
httplib.HTTPMessage(filehandle).getdate_tz(headername) 
mimetools.Message(filehandle).getdate() 
rfc822.parsedate(datestr) 
rfc822.parsedate_tz(datestr) 
  • यदि आप एक कच्चे डेटा धारा है, तो आप एक HTTPMessage या एक mimetools निर्माण कर सकते हैं। इससे संदेश infos के लिए प्रतिक्रिया ऑब्जेक्ट की क्वेरी, जबकि यह अतिरिक्त मदद की पेशकश कर सकते
  • अगर आप urllib2 का उपयोग कर रहे हैं, तो आप पहले से ही एक HTTPMessage वस्तु filehandler urlopen
  • द्वारा लौटाए में छिपा हुआ यह शायद कई तिथि प्रारूप
  • httplib में है पार्स कर सकते है कोर

नोट:

  • कार्यान्वयन पर एक नज़र था, HTTPMessage mimetools.Message जो rfc822.Message से विरासत से विरासत। दो फ़्लोटिंग डीफ़ आपकी रुचि के हो सकते हैं, पार्सडेट और पार्सडेट_टीजे (बाद में)
  • ईमेल से पार्सडेट (_tz) एक अलग कार्यान्वयन है, हालांकि यह वही दिखता है।

अगर आप केवल स्ट्रिंग के उस टुकड़े है और आप इसे पार्स करने के लिए चाहते हैं आप ऐसा कर सकते हैं,:

>>> from rfc822 import parsedate, parsedate_tz 
>>> parsedate('Wed, 23 Sep 2009 22:15:29 GMT') 
(2009, 9, 23, 22, 15, 29, 0, 1, 0) 
>>> 

लेकिन मुझे माइम संदेशों के माध्यम से उदाहरण देना है:

import mimetools 
import StringIO 
message = mimetools.Message(
    StringIO.StringIO('Date:Wed, 23 Sep 2009 22:15:29 GMT\r\n\r\n')) 
>>> m 
<mimetools.Message instance at 0x7fc259146710> 
>>> m.getdate('Date') 
(2009, 9, 23, 22, 15, 29, 0, 1, 0) 

या के माध्यम से http संदेश (प्रतिक्रियाएं)

>>> from httplib import HTTPMessage 
>>> from StringIO import StringIO 
>>> http_response = HTTPMessage(StringIO('Date:Wed, 23 Sep 2009 22:15:29 GMT\r\n\r\n')) 
>>> #http_response can be grabbed via urllib2.urlopen(url).info(), right? 
>>> http_response.getdate('Date') 
(2009, 9, 23, 22, 15, 29, 0, 1, 0) 

सही?

>>> import urllib2 
>>> urllib2.urlopen('https://fw.io/').info().getdate('Date') 
(2014, 2, 19, 18, 53, 26, 0, 1, 0) 

वहाँ, अब हम अब तिथि प्रारूप, माइम संदेश, माइम उपकरण और उनके pythonic कार्यान्वयन ;-)

जो कुछ भी मामले के बारे में अधिक, http हेडर पार्स करने के लिए email.utils का उपयोग कर की तुलना में बेहतर लग रहा है।

+0

अब लगता है (दिसंबर 2016) आरएफसी 822 बहिष्कृत है, ईमेल पैकेज दस्तावेज़ के प्रति एक पसंदीदा दृष्टिकोण है। https://docs.python.org/2/library/rfc822.html – StanleyZ

संबंधित मुद्दे