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

2024-09-29 06:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python解析html,其中有日期字符串:[ 24-Янв-17 07:24 ]。”ЯЯН”是“简”。我想把它转换成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: time data '[ 24-\xd0\xaf\xd0\xbd\xd0\xb2-17 07:24 ]' does not match format '[ %d-%b-%y %H:%M ]'

type(timeData)返回unicode。从utf-8编码timeData返回UnicodeEncodeError。怎么了?在


chardet返回{'confidence': 0.87625, 'encoding': 'utf-8'},当我写:datetime.datetime.strptime(timeData.encode('utf-8'), ...)时,它返回上面的错误。在


原始页具有window-1251编码。在

^{pr2}$

退货

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

Tags: 对象字符串编码datadatetimetimehtmltype
2条回答

快速修复

明白了!янв在CPython 2.7.12中必须是小写。代码(CPy 2.7.12和CPy 3.4.5中关于cygwin的工作):

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

结果:

^{2}$

如果我使用大写Янв,它在py3中有效,但是在py2中它给出了

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

一般情况

要在Python2中处理这个问题,请先使用小写字母(请参见this answer):

# 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

我不能用你的beauthulsoup代码测试它,但是,一般来说,使用Unicode 然后使用上面的数据。在

或者,如果可能的话,切换到python3:)。在

解释

我是怎么想出来的?我在CPython源代码中查找strptimesearch)的代码。我找到了方便的^{}模块,其中包含^{}。我还发现了LocaleTimemention。要打印可用的月份名称,请执行以下操作(添加到上述“快速修复”下的代码末尾):

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

a_month具有每个the source的缩写月份名称。在

在Py3上,可以得出:

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

在Py2上,结果是:

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

还有一堆。请注意,第一个字符是\xd1\x8f,在错误消息中,\xd0\xaf不匹配。在

您只需将俄语月份名称更改为英语:

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

相关问题 更多 >