2009-09-24 15 views
29

Esiste un modo semplice per analizzare le stringhe di data HTTP in Python? Secondo the standard, esistono diversi modi per formattare le stringhe di data HTTP; il metodo dovrebbe essere in grado di gestirlo.Come analizzare una stringa di data HTTP in Python?

In altre parole, voglio convertire una stringa come "Wed, 23 set 2009 22:15:29 GMT" in una struttura temporale python.

risposta

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) 

Se si desidera un oggetto datetime.datetime, si può fare:

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

Sì, parsedate è probabilmente il miglior compromesso, anche se il suo "tollerante RFC 2822 parsing" non è compatibile al 100% con RFC 2616'2 che richiede "MUST" - ad esempio, epic fail sul formato RFC 850 con anni a due cifre, come 'Sunday, 06-Nov-94 08:49:37 GMT', eppure 2616 dice che un cliente DEVE essere in grado di analizzare date di RFC 850 (sigh). –

+0

email.Utils.parsedate sembra sufficiente, grazie. Ma è confuso che a volte viene chiamato email.utils e talvolta email.Utils. Immagino che la versione email.Utils sia una vecchia variante precedente che è stata deprecata (?) –

+1

'email.utils.parsedate è email.Utils.parsedate -> True. Sembra che * U * tils sia un caricatore pigro. – 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

questo gestirà solo un formato! – Agos

+0

sì, ed è abbastanza facile estenderlo per gestire qualsiasi formato. mentre 'email.utils.parse' è più robusto, è anche meno trasparente. – SilentGhost

+5

% a dipende dalle impostazioni internazionali, quindi in genere non funziona – stach

1
httplib.HTTPMessage(filehandle).getdate(headername) 
httplib.HTTPMessage(filehandle).getdate_tz(headername) 
mimetools.Message(filehandle).getdate() 
rfc822.parsedate(datestr) 
rfc822.parsedate_tz(datestr) 
  • se si dispone di un flusso di dati grezzi, è possibile costruire un HTTPMessage o di un mimetools. Messaggio da esso essa può offrire un ulteriore aiuto durante l'interrogazione l'oggetto di risposta per informazioni
  • se si utilizza urllib2, si dispone già di un oggetto HTTPMessage nascosto nel filehandler restituito da urlopen
  • probabilmente può analizzare molti formati di data
  • httplib è in il nucleo

NOTA:

  • dato un'occhiata alla implementazione, HTTPMessage eredita da mimetools.Message che eredita da rfc822.Message. due variabili fluttuanti sono di tuo interesse forse, parsedate e parsedate_tz (nel secondo)
  • parsedate (_tz) da email.utils ha un'implementazione diversa, anche se sembra un po 'lo stesso.

si può fare questo, se avete solo quel pezzo di corda e si vuole analizzarlo:

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

ma lascia che applichiamo nella messaggi 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 tramite messaggi http (risposte)

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

giusto?

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

lì, ora noi ora più su formati di data, i messaggi MIME, strumenti di mimo e la loro implementazione divinatorio ;-)

in ogni caso, sembra meglio che usare email.Utils per l'analisi di intestazioni HTTP.

+0

Sembra ora (Dicembre 2016) rfc 822 è deprecato, il pacchetto di posta elettronica è un approccio preferenziale per il documento. https://docs.python.org/2/library/rfc822.html – StanleyZ

Problemi correlati