2009-09-24 16 views
29

Python'da HTTP tarih dizelerini ayrıştırmanın kolay bir yolu var mı? the standard'a göre, HTTP tarih dizelerini biçimlendirmenin birkaç yolu vardır; yöntem bu işlemek mümkün olmalıdır.Python'da bir HTTP tarih dizesini nasıl ayrıştırırım?

Diğer bir deyişle, "Wed, 23 Sep 2009 22:15:29 GMT" gibi bir dizeyi python zaman yapısına dönüştürmek istiyorum. Bir datetime.datetime nesneyi istiyorsanız

cevap

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) 

, yapabileceğiniz: Bir ham veri akışı varsa

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

Yep, parsedate muhtemelen "en iyi uzlaşmadır", ancak "toleranslı RFC 2822 ayrıştırma", RFC 2616'2 "ZORUNLU" ile% 100 uyumlu değildir - örneğin, RFC 850 formatındaki destansı başarısız Pazar, 06-Nov-94 08:49:37 GMT gibi iki basamaklı yıllarla, ancak 2616, bir müşterinin RFC 850 tarihlerini (iç çekiş) ayrıştırması ZORUNLUDUR. –

+0

email.Utils.parsedate yeterli görünüyor, teşekkürler. Ancak bazen e-mail.utils ve bazen email.Utils olarak adlandırılıyor. Ben e-posta.Utils sürümü eski bir miras varyantı (?) –

+1

'email.utils.parsedate olduğunu email.Utils.parsedate -> True' olduğunu sanırım * U * tils tembel bir yükleyici. – 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

Bu, yalnızca bir biçim işleyecektir! – Agos

+0

evet, ve herhangi bir formatı işlemek için genişletmek oldukça kolaydır. 'email.utils.parse' daha sağlam olsa da, daha az şeffaftır. – SilentGhost

+5

% a, yerel ayara bağlıdır, bu nedenle genellikle – stach

1
httplib.HTTPMessage(filehandle).getdate(headername) 
httplib.HTTPMessage(filehandle).getdate_tz(headername) 
mimetools.Message(filehandle).getdate() 
rfc822.parsedate(datestr) 
rfc822.parsedate_tz(datestr) 
  • , bir HttpMessage veya mimetools inşa edebilirsiniz. Mesajdan. diğer bilgiler için tepki nesne sorgulama sırasında urllib2 kullanıyorsanız, zaten urlopen
  • tarafından döndürülen FileHandler gizli bir HttpMessage nesnesi muhtemelen
  • httplib olduğu birçok tarih biçimleri ayrıştırabileceğiniz sahip
  • o ek yardım sunabilir çekirdek

NOT:

  • HttpMessage rfc822.Message devraldığı mimetools.Message devraldığı, uygulama bir göz vardı. iki yüzer def, sizin ilginizi çekebilir, parsedate ve parsedate_tz (ikincisindeki) e-postadan
  • ayrıştırma işlemi (_tz) farklı bir uygulamaya sahiptir.

yalnızca dize parçasına sahip ve bunu ayrıştırmak istiyorsanız, bunu yapabilirsiniz:

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

ama bana mim mesaj yoluyla örnek alalım:

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) 

veya üzeri http iletileri (yanıtları)

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

right? şimdi artık daha tarih biçimleri, mim mesajları, mim araçları ve bunların pythonic uygulanması ;-)

durum ne olursa olsun hakkında orada

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

, http başlıklarını ayrıştırma için email.utils kullanarak daha iyi görünüyor.

+0

Şimdilik (Aralık 2016) rfc 822 kullanımdan kaldırıldı, e-posta paketi belge başına tercih edilen bir yaklaşımdır. https://docs.python.org/2/library/rfc822.html – StanleyZ

İlgili konular