如何在Python中解析HTTP日期字符串?

How do I parse an HTTP date-string in Python?

有没有一种简单的方法来解析Python中的HTTP日期字符串? 根据标准,有几种方法可以格式化HTTP日期字符串; 该方法应该能够处理这个问题。

换句话说,我想将像"Wed,2009年9月23日22:15:29 GMT"这样的字符串转换为python时间结构。


1
2
3
>>> 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对象,你可以这样做:

1
2
def my_parsedate(text):
    return datetime.datetime(*eut.parsedate(text)[:6])


1
2
3
>>> 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)


1
2
3
4
5
httplib.HTTPMessage(filehandle).getdate(headername)
httplib.HTTPMessage(filehandle).getdate_tz(headername)
mimetools.Message(filehandle).getdate()
rfc822.parsedate(datestr)
rfc822.parsedate_tz(datestr)
  • 如果您有原始数据流,则可以从中构建HTTPMessage或mimetools.Message。它可以在查询信息的响应对象时提供额外的帮助
  • 如果您使用的是urllib2,则已经在urlopen返回的文件处理程序中隐藏了一个HTTPMessage对象
  • 它可以解析许多日期格式
  • httplib是核心

注意:

  • 看看实现,HTTPMessage继承自mimetools.Message,它继承自rfc822.Message。您可能会感兴趣的两个浮动defs,parsedate和parsedate_tz(在后者中)
  • 来自email.utils的parsedate(_tz)有不同的实现,虽然它看起来有点相同。

你可以这样做,如果你只有那段字符串,你想要解析它:

1
2
3
4
>>> 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消息举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
import mimetools
import StringIO
message = mimetools.Message(
    StringIO.StringIO('Date:Wed, 23 Sep 2009 22:15:29 GMT



'
))
>>> m
<mimetools.Message instance at 0x7fc259146710>
>>> m.getdate('Date')
(2009, 9, 23, 22, 15, 29, 0, 1, 0)

或通过http消息(回复)

1
2
3
4
5
6
7
8
9
10
>>> from httplib import HTTPMessage
>>> from StringIO import StringIO
>>> http_response = HTTPMessage(StringIO('Date:Wed, 23 Sep 2009 22:15:29 GMT



'
))
>>> #http_response can be grabbed via urllib2.urlopen(url).info(), right?
>>> http_response.getdate('Date')
(2009, 9, 23, 22, 15, 29, 0, 1, 0)

对?

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

那里,现在我们现在更多关于日期格式,哑剧消息,哑剧工具和他们的pythonic实现;-)

无论如何,看起来比使用email.utils解析http标头更好。