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

时间:2009-09-24 14:15:40

标签: python http datetime parsing

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

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

4 个答案:

答案 0 :(得分:44)

>>> 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])

答案 1 :(得分: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)

答案 2 :(得分: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.Message。它可以在查询信息的响应对象时提供额外的帮助
  • 如果你使用urllib2,你已经在urlopen返回的文件处理程序中隐藏了一个HTTPMessage对象
  • 它可能会解析许多日期格式
  • httplib在核心

注意:

  • 查看了实现,HTTPMessage继承自mimetools.Message,它继承自rfc822.Message。您可能会感兴趣的两个浮动defs,parsedate和parsedate_tz(在后者中)
  • 来自email.utils的
  • parsedate(_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消息,mime工具及其pythonic实现; - )

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

答案 3 :(得分:0)

自Python 3.3起,enter image description here可以解析email.utils.parsedate_to_datetime时间戳(又名IMF-fixdate,Internet消息格式固定长度格式,RFC 5322HTTP-date的子集)。

>>> from email.utils import parsedate_to_datetime
... 
... s = 'Sun, 06 Nov 1994 08:49:37 GMT'
... parsedate_to_datetime(s)
0: datetime.datetime(1994, 11, 6, 8, 49, 37, tzinfo=datetime.timezone.utc)

还有未公开的RFC 7231,它可以达到以下目的:

>>> from datetime import datetime, timezone
... from http.cookiejar import http2time
... 
... s = 'Sun, 06 Nov 1994 08:49:37 GMT'
... datetime.utcfromtimestamp(http2time(s)).replace(tzinfo=timezone.utc)
1: datetime.datetime(1994, 11, 6, 8, 49, 37, tzinfo=datetime.timezone.utc)

它在Python 2.4中作为http.cookiejar.http2time引入,用于处理以相同格式表示的Cookie Expires指令。