我用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
退货
<type 'unicode'>
[ 24-Янв-17 07:24 ]
<type 'str'>
[ 24-???-17 07:24 ]
得到它了!在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] 删除。
我来说两句