2009-09-24 10 views

Odpowiedz

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) 

Jeśli chcesz datetime.datetime obiektu, można zrobić:

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

Tak, to prawdopodobnie najlepszy kompromis, ale jego "tolerancyjne analizowanie RFC 2822" nie jest w 100% kompatybilne z RFC 2616'2 wymagającym "MUSI" - np. epickim niepowodzeniem w formacie RFC 850 z dwucyfrowymi latami, takimi jak 'Sunday, 06-Nov-94 08:49:37 GMT', ale 2616 mówi, że klient MUSI być w stanie przeanalizować daty RFC 850 (westchnienie). –

+0

email.Utils.parsedate wydaje się wystarczający, dziękuję. Ale jest to mylące, że czasami nazywa się e-mail.utils, a czasem e-mailem. Domyślam się, że wersja email.Utils jest starszą wersją, która została przestarzała (?) –

+1

'email.utils.parsedate to email.Utils.parsedate -> True' Wygląda na to, że * U * tils jest leniwym programem ładującym. – 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

to zajmie tylko jeden format! – Agos

+0

tak, i dość łatwo jest rozszerzyć obsługę dowolnego formatu. podczas gdy 'email.utils.parse' jest bardziej niezawodny, jest również mniej przejrzysty. – SilentGhost

+5

% a jest zależny od lokalizacji, więc generalnie nie zadziała – stach

1
httplib.HTTPMessage(filehandle).getdate(headername) 
httplib.HTTPMessage(filehandle).getdate_tz(headername) 
mimetools.Message(filehandle).getdate() 
rfc822.parsedate(datestr) 
rfc822.parsedate_tz(datestr) 
  • jeśli masz surowy strumień danych, można zbudować HttpMessage lub mimetools. Wiadomość od niego. może zaoferować dodatkową pomoc podczas odpytywania obiekt odpowiedzi na informacje o
  • jeśli używasz urllib2, masz już przedmiot HttpMessage ukryty w filehandler zwróconej przez urlopen
  • może prawdopodobnie analizować wiele formatów daty
  • httplib jest w rdzeń

UWAGA:

  • miał spojrzeć na życie, HttpMessage dziedziczy mimetools.Message która dziedziczy z rfc822.Message. dwie zmienne defs są waszym zainteresowaniem może, parseate i parseate_tz (w tym ostatnim)
  • parsowana (_tz) z email.utils ma inną implementację, chociaż wygląda trochę tak samo.

można to zrobić, jeśli masz tylko ten kawałek sznurka i chcesz go zanalizować:

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

ale pozwól mi przykładem pośrednictwem wiadomości 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) 

lub za pośrednictwem Wiadomości http (odpowiedzi)

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

prawda?

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

tam, teraz już więcej na temat formatów daty, wiadomości MIME narzędzi MIME i ich pythonic realizacji ;-)

każdym razie, wygląda lepiej niż przy użyciu email.utils do analizowania nagłówków HTTP.

+0

Wydaje się, że teraz (grudzień 2016) rfc 822 jest przestarzały, pakiet wiadomości e-mail jest preferowanym podejściem do dokumentu. https://docs.python.org/2/library/rfc822.html – StanleyZ

Powiązane problemy