2009-09-24 51 views

回答

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

是的,parsedate可能是最好的折衷方案,雖然它的「寬容RFC 2822解析」與RFC 2616'2不是100%兼容,要求「必須」 - 例如,RFC 850格式的史詩失敗兩位數年份,例如'Sunday,06-Nov-94 08:49:37 GMT',但2616表示客戶端必須能夠解析RFC 850日期(嘆氣)。 – 2009-09-24 15:19:19

+0

email.Utils.parsedate似乎足夠了,謝謝。但令人困惑的是,它有時被稱爲email.utils,有時被稱爲email.Utils。我想這個email.Utils版本是一箇舊的遺留變體,已被棄用(?) – 2009-09-24 20:43:58

+1

'email.utils.parsedate是email.Utils.parsedate - > True'看來* U * tils是一個懶惰的加載器。 – jfs 2009-09-24 22:24:18

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 2009-09-24 16:40:27

+0

是的,擴展以處理任何格式都相當容易。而'email.utils.parse'更健壯,它也不那麼透明。 – SilentGhost 2009-09-24 16:42:10

+5

%a是語言環境依賴性,所以通常不會工作 – stach 2010-03-31 11:50:02

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。來自它的消息。它可能會提供額外的幫助,而查詢的相關信息的響應對象
  • 如果你正在使用的urllib2,你已經隱藏在通過的urlopen
  • 返回的FileHandler一個HTTPMessage對象大概可以分析許多日期格式
  • httplib的是核心

注:

  • 看了一眼實施,HTTPMessage從mimetools.Message從rfc822.Message繼承繼承。兩個浮動列表可能是你感興趣的,parsedate和parsedate_tz(在後者中)
  • 從email.utils解析(_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) 
>>> 

,但讓我通過MIME消息例證:

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) 

那裏,現在我們現在瞭解日期格式,MIME消息,啞劇工具及其Python的實現;-)

不管怎樣,看起來比使用email.utils解析HTTP頭更好。

+0

似乎現在(2016年12月)rfc 822被棄用,電子郵件包是每個文件的首選方法。 https://docs.python.org/2/library/rfc822.html – StanleyZ 2016-12-29 03:24:21