如何在strptime中使用俄语日期字符串

马克斯·弗赖

我用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。timeDatautf-8返回编码UnicodeEncodeError怎么了?


chardet返回{'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

退货

<type 'unicode'>
[ 24-Янв-17 07:24 ]
<type 'str'>
[ 24-???-17 07:24 ]
x

快速解决

得到它了!在CPython 2.7.12中янв必须小写代码(在cygwin上的CPy 2.7.12和CPy 3.4.5中有效):

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

结果:

2017-01-24 07:24:00

如果我使用大写字母Янв,则可以在Py 3中使用,但在Py 2中可以使用

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

一般情况

在Python 2中总体上处理此问题,请先使用小写字母(请参阅此答案):

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

结果:

[ 24-янв-17 07:24 ]
2017-01-24 07:24:00

我无法使用您的beautifulsoup代码对其进行测试,但是通常来说,先获取Unicode数据,然后使用上面的代码。

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

说明

那我怎么想的呢?我去寻找在CPython的源代码strptime搜索)。我找到了方便的_strptime模块,其中包含class LocaleTime我还发现一个LocaleTime要打印可用的月份名称,请执行以下操作(添加到上面“快速修复”下的代码末尾):

from _strptime import LocaleTime
lt = LocaleTime()
print(lt.a_month)    

a_month每个都有缩写的月份名称

在Py3上,产生:

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

在Py2上,产生:

['', '\xd1\x8f\xd0\xbd\xd0\xb2',

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章