Подтвердить что ты не робот

Как обрабатывать строку даты HTTP в Python?

Есть ли простой способ проанализировать строки даты HTTP в Python? Согласно стандарт, существует несколько способов форматирования строк даты HTTP; метод должен иметь возможность справиться с этим.

Другими словами, я хочу преобразовать строку типа "Wed, 23 Sep 2009 22:15:29 GMT" в структуру времени python.

4b9b3361

Ответ 1

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

Ответ 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)

Ответ 3

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, у вас уже есть объект HTTPMessage, скрытый в обработчике файлов, возвращенный urlopen
  • он может, возможно, анализировать многие форматы даты.
  • httplib находится в ядре

ПРИМЕЧАНИЕ:

  • посмотрел на реализацию, HTTPMessage наследует от mimetools.Message, которая наследуется от rfc822.Message. два плавающих defs представляют интерес, возможно, parsedate и parsedate_tz (в последнем)
  • parsedate (_tz) из email.utils имеет другую реализацию, хотя выглядит примерно так.

вы можете сделать это, если у вас есть только эта часть строки, и вы хотите ее проанализировать:

>>> 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.