2009-09-24 5 views
29

Existe-t-il un moyen facile d'analyser les chaînes de dates HTTP en Python? Selon the standard, il existe plusieurs façons de formater les chaînes de date HTTP; la méthode devrait être capable de gérer cela. En d'autres termes, je souhaite convertir une chaîne du type "Mer, 23 Sep 2009 22:15:29 GMT" en une structure temporelle python.Comment analyser une chaîne de date HTTP en Python?

Répondre

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 vous voulez un objet datetime.datetime, vous pouvez faire:

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

Oui, le parsedate est probablement le meilleur compromis, bien que son "analyse RFC 2822 tolérante" ne soit pas 100% compatible avec RFC 2616'2 exigeant "MUST" - par exemple, échec épique sur le format RFC 850 avec des années à deux chiffres, comme «Sunday, 06-Nov-94 08:49:37 GMT», 2616 dit encore qu'un client DOIT être capable d'analyser les dates RFC 850 (soupir). –

+0

email.Utils.parsedate semble suffisant, merci. Mais il est déroutant que cela s'appelle parfois email.utils, et parfois email.Utils. Je suppose que la version email.Utils est une ancienne variante qui a été abandonnée (?) –

+1

'email.utils.parsedate est email.Utils.parsedate -> True' Il semble que * U * tils est un loader paresseux. – 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

cela ne gérera qu'un seul format! – Agos

+0

oui, et il est assez facile à étendre pour gérer n'importe quel format. alors que 'email.utils.parse' est plus robuste, il est aussi moins transparent. – SilentGhost

+5

% a dépend des paramètres régionaux et ne fonctionne donc généralement pas – 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 vous avez un flux de données brutes, vous pouvez construire un HttpMessage ou un mimetools. Message de celui-ci. il peut offrir une aide supplémentaire tout en interrogeant l'objet de réponse pour infos
  • si vous utilisez urllib2, vous avez déjà un objet HttpMessage caché dans le Filehandler retourné par urlopen
  • il peut probablement analyser de nombreux formats de date
  • httplib est en le noyau

REMARQUE:

  • avait un regard sur la mise en œuvre, HttpMessage hérite de mimetools.Message qui hérite de rfc822.Message. deux defs flottants sont de votre intérêt peut-être, parsedate et parsedate_tz (dans le dernier)
  • parsedate (_tz) from email.utils a une implémentation différente, bien que cela ressemble un peu à la même chose.

vous pouvez le faire, si vous avez seulement ce morceau de ficelle et que vous voulez l'analyser:

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

, mais laissez-moi exemplifie par des messages 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) 

ou via Messages http (réponses)

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

droite?

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

là, maintenant nous maintenant plus sur les formats de date, les messages mime, des outils de mime et leur mise en œuvre pythonique ;-)

quel que soit le cas, semble mieux que d'utiliser email.utils pour analyser les en-têtes HTTP.

+0

Semble maintenant (décembre 2016) rfc 822 est obsolète, le paquet de courrier électronique est une approche préférée par le document. https://docs.python.org/2/library/rfc822.html – StanleyZ

Questions connexes