有没有一种简单的方法来解析Python中的HTTP日期字符串?根据the standard,有几种方法可以格式化HTTP日期字符串;该方法应该能够处理这个问题。如何解析Python中的HTTP日期字符串?
换句话说,我想将“Wed,23 Sep 2009 22:15:29 GMT”这样的字符串转换为python时间结构。
有没有一种简单的方法来解析Python中的HTTP日期字符串?根据the standard,有几种方法可以格式化HTTP日期字符串;该方法应该能够处理这个问题。如何解析Python中的HTTP日期字符串?
换句话说,我想将“Wed,23 Sep 2009 22:15:29 GMT”这样的字符串转换为python时间结构。
>>> 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])
>>> 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)
这将只处理一种格式! – Agos 2009-09-24 16:40:27
是的,扩展以处理任何格式都相当容易。而'email.utils.parse'更健壮,它也不那么透明。 – SilentGhost 2009-09-24 16:42:10
%a是语言环境依赖性,所以通常不会工作 – stach 2010-03-31 11:50:02
httplib.HTTPMessage(filehandle).getdate(headername)
httplib.HTTPMessage(filehandle).getdate_tz(headername)
mimetools.Message(filehandle).getdate()
rfc822.parsedate(datestr)
rfc822.parsedate_tz(datestr)
注:
你可以做到这一点,如果你只有那段绳子,你要分析它:
>>> 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头更好。
似乎现在(2016年12月)rfc 822被弃用,电子邮件包是每个文件的首选方法。 https://docs.python.org/2/library/rfc822.html – StanleyZ 2016-12-29 03:24:21
是的,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
email.Utils.parsedate似乎足够了,谢谢。但令人困惑的是,它有时被称为email.utils,有时被称为email.Utils。我想这个email.Utils版本是一个旧的遗留变体,已被弃用(?) – 2009-09-24 20:43:58
'email.utils.parsedate是email.Utils.parsedate - > True'看来* U * tils是一个懒惰的加载器。 – jfs 2009-09-24 22:24:18