2009-09-24 33 views

Trả lời

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) 

Nếu bạn muốn có một đối tượng datetime.datetime, bạn có thể làm:

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

Đúng, phân tích cú pháp có thể là sự thỏa hiệp tốt nhất, mặc dù "phân tích cú pháp RFC 2822" không tương thích 100% với RFC 2616'2 yêu cầu "PHẢI" - ví dụ, sử thi thất bại trên định dạng RFC 850 với hai chữ số năm, chẳng hạn như 'Chủ nhật, 06-Nov-94 08:49:37 GMT', nhưng 2616 nói một khách hàng PHẢI có thể phân tích ngày RFC 850 (tiếng thở dài). –

+0

email.Utils.parsedate có vẻ đủ, cảm ơn. Nhưng nó gây nhầm lẫn rằng nó đôi khi được gọi là email.utils, và đôi khi email.Utils. Tôi đoán rằng phiên bản email.Utils là một biến thể cũ cũ đã không được chấp nhận (?) –

+1

'email.utils.parsedate là email.Utils.parsedate -> True' Có vẻ như * U * tils là trình tải chậm. – 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

điều này sẽ chỉ xử lý một định dạng! – Agos

+0

có, và nó khá dễ dàng để mở rộng để xử lý bất kỳ định dạng nào. trong khi 'email.utils.parse' mạnh mẽ hơn, nó cũng ít minh bạch hơn. – SilentGhost

+5

% a phụ thuộc vào miền địa phương, vì vậy sẽ không hoạt động bình thường – stach

1
httplib.HTTPMessage(filehandle).getdate(headername) 
httplib.HTTPMessage(filehandle).getdate_tz(headername) 
mimetools.Message(filehandle).getdate() 
rfc822.parsedate(datestr) 
rfc822.parsedate_tz(datestr) 
  • nếu bạn có một dòng dữ liệu thô, bạn có thể xây dựng một HTTPMessage hoặc một mimetools. Thông điệp từ nó. nó có thể cung cấp thêm sự giúp đỡ trong khi truy vấn đối tượng response cho infos
  • nếu bạn đang sử dụng urllib2, bạn đã có một đối tượng HTTPMessage ẩn trong filehandler trả về bởi urlopen
  • nó có lẽ có thể phân tích nhiều định dạng ngày
  • httplib là trong lõi

LƯU Ý:

  • đã có một cái nhìn tại thực hiện, HTTPMessage thừa hưởng từ mimetools.Message mà kế thừa từ rfc822.Message. hai dấu phẩy động có thể được bạn quan tâm, phân tích cú pháp và phân tích cú pháp_tz (sau này)
  • phân tách cú pháp (_tz) từ email.utils có cách triển khai khác, mặc dù nó trông giống nhau.

bạn có thể làm điều này, nếu bạn chỉ có mảnh chuỗi và bạn muốn phân tích nó:

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

nhưng hãy để tôi minh họa thông qua tin nhắn kịch câ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) 

hoặc qua http messages (response)

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

phải không?

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

ở đó, bây giờ chúng tôi bây giờ nhiều hơn về định dạng ngày, tin nhắn kịch câm, kịch câm công cụ và thực hiện pythonic họ ;-)

dù thế nào thì trông tốt hơn so với sử dụng email.utils cho phân tích header http.

+0

Có vẻ như bây giờ (tháng 12 năm 2016), RFID 822 không được chấp nhận, gói email là một cách tiếp cận được ưu tiên hơn cho mỗi tài liệu. https://docs.python.org/2/library/rfc822.html – StanleyZ

Các vấn đề liên quan