如何使用strptime使用俄罗斯日期字符串

时间:2017-01-24 21:56:25

标签: python encoding

我用python解析html,并且有日期字符串:[ 24-Янв-17 07:24 ]。 “Янв”是“Jan”。我想将它转换为datetime对象。

# Some beautifulsoup parsing
timeData = data.find('div', {'id' : 'time'}).text

import locale
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
result = datetime.datetime.strptime(timeData, u'[ %d-%b-%y  %H:%M ]')

错误是:

  

ValueError:时间数据'[24- \ xd0 \ xaf \ xd0 \ xbd \ xd0 \ xb2-17 07:24]'确实   不匹配格式'[%d-%b-%y%H:%M]'

type(timeData)返回unicode。来自timeData的{​​{1}}代码会返回utf-8。怎么了?

chardet返回UnicodeEncodeError,当我写:{'confidence': 0.87625, 'encoding': 'utf-8'}时,它会返回上述错误。

原始网页有datetime.datetime.strptime(timeData.encode('utf-8'), ...)个编码。

window-1251

返回

print type(timeData)
print timeData


timeData = timeData.encode('cp1251')
print type(timeData)
print timeData

2 个答案:

答案 0 :(得分:4)

快速修复

知道了! .hide { background-color: yellow; } /* just for demo purposes */必须是CPython 2.7.12中的小写。代码(适用于cygwin的CPy 2.7.12和CPy 3.4.5):

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="entry-content">
    [embed]https://www.youtube.com/watch?v=y545JdKuHOs[/embed] This is some other copy.
</div>
<div class="entry-content">
    [embed]https://www.youtube.com/watch?v=dK45JuOsy5H[/embed] This is some other copy.
</div>

结果:

янв

如果我使用大写# coding=utf8 #timeData='[ 24-Янв-17 07:24 ]' timeData='[ 24-янв-17 07:24 ]' ### lower-case import datetime import locale locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8') result = datetime.datetime.strptime(timeData, u'[ %d-%b-%y %H:%M ]') print(result) ,它在Py 3中工作,但在Py 2中它给出了

2017-01-24 07:24:00

一般情况

要处理这一点,一般是在Python 2中,小写优先(见this answer):

Янв

结果:

ValueError: time data '[ 24-\xd0\xaf\xd0\xbd\xd0\xb2-17 07:24 ]' does not match format '[ %d-%b-%y  %H:%M ]'

我不能用你的漂亮的代码来测试它,但一般来说,获得Unicode 然后使用上面的数据。

或者,如果可能的话,切换到Python 3 :)。

说明

那我是怎么想到的呢?我在CPython源代码中查找# coding=utf8 timeData=u'[ 24-Янв-17 07:24 ]' # ^ unicode data import datetime import locale locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8') print(timeData.lower()) # works OK result = datetime.datetime.strptime( timeData.lower().encode('utf8'), u'[ %d-%b-%y %H:%M ]') ## ^^^^^^^^^^^^^^ back to a string ## ^^^^^^^ lowercase print(result) search)的代码。我找到了方便的_strptime模块,其中包含class LocaleTime。我还找到了[ 24-янв-17 07:24 ] 2017-01-24 07:24:00 strptime。要打印可用的月份名称,请执行此操作(添加到&#34下的代码末尾;快速修复,&#34;上面):

LocaleTime

from _strptime import LocaleTime lt = LocaleTime() print(lt.a_month) 每个mention都有缩写的月份名称。

在Py3上,产生:

a_month

在Py2上,产生:

['', 'янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек']
      ^ lowercase!

还有更多。请注意,第一个字符为['', '\xd1\x8f\xd0\xbd\xd0\xb2', ,在您的错误消息中,\xd1\x8f并不匹配。

答案 1 :(得分:0)

您可以用英语更改俄语月份名称:

ru_to_eng_months = {'Янв': 'Jan', } # fill it with other months

def ru_to_eng_datetime(ru) -> string:
    s = ru.split('-')
    eng_month  = ru_to_eng_months[s[1]]
    return s[0] + '-' + eng_month + '-' + s[2]

s = u'[ 24-Янв-17 07:24 ]'
dateTime = ru_to_eng_datetime(s)
result = datetime.datetime.strptime(dateTime, u'[ %d-%b-%y  %H:%M ]')
print(result) # 2017-01-24 07:24:00