当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在strptime中使用俄语日期字符串》经验,为你挑选了1个好方法。

我用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

退货


[ 24-???-17 07:24 ]

[ 24-???-17 07:24 ]

cxw.. 6

快速解决

得到它了! 在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中不匹配。



1> cxw..:

快速解决

得到它了! 在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中不匹配。

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有