web-dev-qa-db-ja.com

PythonでHTTP日付文字列を解析するにはどうすればよいですか?

PythonでHTTP日付文字列を解析する簡単な方法はありますか? 標準 によると、HTTP日付文字列をフォーマットする方法はいくつかあります。メソッドはこれを処理できる必要があります。

つまり、「Wed、23 Sep 2009 22:15:29GMT」のような文字列をpython time-structure」に変換したいと思います。

39
Troels Arvin
>>> import email.utils as eut
>>> eut.parsedate('Wed, 23 Sep 2009 22:15:29 GMT')
(2009, 9, 23, 22, 15, 29, 0, 1, -1)

datetime.datetimeオブジェクトが必要な場合は、次のことができます。

def my_parsedate(text):
    return datetime.datetime(*eut.parsedate(text)[:6])
50
tzot
>>> 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)
4
SilentGhost
httplib.HTTPMessage(filehandle).getdate(headername)
httplib.HTTPMessage(filehandle).getdate_tz(headername)
mimetools.Message(filehandle).getdate()
rfc822.parsedate(datestr)
rfc822.parsedate_tz(datestr)
  • 生データストリームがある場合は、そこからHTTPMessageまたはmimetools.Messageを作成できます。応答オブジェクトに情報を照会するときに、追加のヘルプが提供される場合があります
  • urllib2を使用している場合は、urlopenによって返されるファイルハンドラーにHTTPMessageオブジェクトが隠されています。
  • おそらく多くの日付形式を解析できます
  • httplibはコアにあります

注意:

  • 実装を見てみると、HTTPMessageはrfc822.Messageから継承するmimetools.Messageから継承しています。おそらく、parsedateとparsedate_tz(後者の場合)の2つのフローティング定義が重要です。
  • email.utilsのparsedate(_tz)の実装は異なりますが、見た目は同じです。

その文字列のみがあり、それを解析したい場合は、これを行うことができます。

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

しかし、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)

またはhttpメッセージ(応答)を介して

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

正しい?

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

そこで、日付形式、MIMEメッセージ、MIMEツール、およびそれらのPythonic実装について詳しく説明します;-)

いずれにせよ、httpヘッダーの解析にemail.utilsを使用するよりも見栄えが良くなります。

1
user237419

Python 3.3なので、解析できる email.utils.parsedate_to_datetimeRFC 5322 タイムスタンプ(別名IMF-fixdate、インターネットメッセージ形式が修正されました)長さ形式、 RFC 7231 )のHTTP-dateのサブセット。

>>> from email.utils import parsedate_to_datetime
... 
... s = 'Sun, 06 Nov 1994 08:49:37 GMT'
... parsedate_to_datetime(s)
0: datetime.datetime(1994, 11, 6, 8, 49, 37, tzinfo=datetime.timezone.utc)

文書化されていない http.cookiejar.http2time もあります。これは次のように同じことを実現できます。

>>> from datetime import datetime, timezone
... from http.cookiejar import http2time
... 
... s = 'Sun, 06 Nov 1994 08:49:37 GMT'
... datetime.utcfromtimestamp(http2time(s)).replace(tzinfo=timezone.utc)
1: datetime.datetime(1994, 11, 6, 8, 49, 37, tzinfo=datetime.timezone.utc)

同じ形式で表現されたCookieExpiresディレクティブを処理するために、Python 2.4 as cookielib.http2time として導入されました。

0
saaj