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) |
如果你想要一个
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标头更好。