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