2009-09-24 12 views

Respuesta

38
>>> import email.utils as eut 
>>> eut.parsedate('Wed, 23 Sep 2009 22:15:29 GMT') 
(2009, 9, 23, 22, 15, 29, 0, 1, -1) 

Si desea que un objeto datetime.datetime, que puede hacer:

def my_parsedate(text): 
    return datetime.datetime(*eut.parsedate(text)[:6]) 
+5

Sí, el parsedate es probablemente el mejor compromiso, aunque su "análisis tolerante RFC 2822" no es 100% compatible con RFC 2616'2 que exige "DEBE" - por ejemplo, falla épica en formato RFC 850 con años de dos dígitos, como "Domingo, 06-Nov-94 08:49:37 GMT", sin embargo, 2616 dice que un cliente DEBE poder analizar las fechas de RFC 850 (suspiro). –

+0

email.Utils.parsedate parece suficiente, gracias. Pero es confuso que a veces se lo llame email.utils, y algunas veces correo electrónico. Utils. Supongo que la versión de email.Utils es una antigua variante heredada que ha quedado obsoleta (?) –

+1

'email.utils.parsedate es email.Utils.parsedate -> True' Parece que * U * tils es un cargador lento. – jfs

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) 
+2

¡esto manejará un solo formato! – Agos

+0

sí, y es bastante fácil de extender para manejar cualquier formato. mientras 'email.utils.parse' es más robusto, también es menos transparente. – SilentGhost

+5

% a depende de la configuración regional, por lo que generalmente no funcionará – stach

1
httplib.HTTPMessage(filehandle).getdate(headername) 
httplib.HTTPMessage(filehandle).getdate_tz(headername) 
mimetools.Message(filehandle).getdate() 
rfc822.parsedate(datestr) 
rfc822.parsedate_tz(datestr) 
  • si tiene un flujo de datos en bruto, se puede construir un HttpMessage o un mimetools. Mensaje de eso puede ofrecer ayuda adicional al consultar el objeto de respuesta para informaciones
  • si está utilizando urllib2, que ya tiene un objeto HttpMessage escondido en el FileHandler devuelto por urlopen
  • probablemente puede analizar muchos formatos de fecha
  • httplib está en el núcleo

NOTA:

  • tenía un vistazo a la aplicación, HttpMessage hereda de mimetools.Message que hereda de rfc822.Message. dos defs flotantes son de su interés, parsedate y parsedate_tz (en este último)
  • parsedate (_tz) de email.utils tiene una implementación diferente, aunque se ve más o menos igual.

puede hacerlo, si sólo tiene ese pedazo de cuerda y desea analizarlo:

>>> from rfc822 import parsedate, parsedate_tz 
>>> parsedate('Wed, 23 Sep 2009 22:15:29 GMT') 
(2009, 9, 23, 22, 15, 29, 0, 1, 0) 
>>> 

pero me deja ejemplificar a través de mensajes 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) 

o vía Mensajes http (respuestas)

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

¿verdad?

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

allí, ya que ahora más sobre los formatos de fecha, los mensajes MIME MIME, herramientas y su aplicación Pythonic ;-)

cualquiera que sea el caso, se ve mejor que el uso de email.utils para analizar las cabeceras HTTP.

+0

Parece que en este momento (diciembre de 2016) rfc 822 está en desuso, el paquete de correo electrónico es un enfoque preferido por el documento. https://docs.python.org/2/library/rfc822.html – StanleyZ

Cuestiones relacionadas