【问题标题】:Split a string in parts and convert this in a datetime将字符串分成几部分并将其转换为日期时间
【发布时间】:2016-10-06 05:09:47
【问题描述】:

我抓取了一个包含以下内容的 html 字符串。

[u'Mitglied seit M\xe4rz 2016']

M\xe4rz 应该是 März(三月的德语单词)。

我想在日期时间转换这个抓取的输出。 我的第一次尝试是将输出转换为字符串,并使用以下代码对其进行拆分。

strDate = string.split(str(scraped))

我现在的新输出是:

["[u'Mitglied", 'seit', 'M\xe4rz', "2016']"]

下一步将在字符串中添加月份的第一天。

> strDate = "1. " + strDate[2] + " " + strDate[3]

新的输出是:

“1.M\xe4rz 2016']”

如何删除 ä 中的 \xe4 并删除 ']。 最后,如何使用 Python 在日期时间中转换此字符串“1. März 2016”。

感谢您的回答。

【问题讨论】:

    标签: python datetime scrapy type-conversion


    【解决方案1】:

    有很多代码。您可以简化或采用它,但我认为它应该有所帮助:

    # encoding: utf-8
    
    import datetime
    
    months = {
        u'Januar': '1',
        u'Februar': '2',
        u'März': '3',
        u'April': '4',
        u'Mai': '5',
        u'Juni': '6',
        u'Juli': '7',
        u'August': '8',
        u'September': '9',
        u'Oktober': '10',
        u'November': '11',
        u'Dezember': '12'
    }
    
    def str2date(str_date, date_format='%d.%m.%Y', err_value=None, do_raise=False):
        u"""
            Convert string with date to datetime instance
        """
        if isinstance(str_date, datetime.date):
            result = str_date
        else:
            datetime_templates = (
                (date_format, 255),
                ('%d.%m.%Y', 10),
                ('%Y-%m-%dT%H:%M:%S', 19),
                ('%Y-%m-%d %H:%M:%S', 19),
                ('%d.%m.%Y %H:%M:%S', 19),
                ('%Y-%m-%dT%H:%M', 16),
                ('%Y-%m-%d %H:%M', 16),
                ('%d.%m.%Y %H:%M', 16),
                ('%Y-%m-%d', 10),
                ('%H:%M:%S', 8),
                ('%H:%M', 5),
            )
    
            for tmpl, baund in datetime_templates:
                try:
                    result_date = datetime.datetime.strptime(str_date[:baund], tmpl).date()
                except (ValueError, TypeError) as err:
                    raise err
                else:
                    result = result_date
                    break
            else:
                if do_raise:
                    raise ValueError
                else:
                    result = err_value
        return result
    
    scrapped = "[u'Mitglied seit M\xe4rz 2016']"
    
    encoded = unicode(scrapped.replace("[u'", '').replace("']", ''), 'unicode-escape')
    
    splitted = encoded.split()
    
    replaced = [months[i] if i in months else i for i in splitted]
    
    str_date = u'.'.join(['1', replaced[2], replaced[3]])
    
    result_date = str2date(str_date)
    
    print result_date
    print isinstance(result_date, datetime.date)
    

    【讨论】:

      【解决方案2】:

      有一种方法可以对 \xe4 字符进行编码。

      str = 'Mitglied seit M\xe4rz 2016'
      str = str.decode('unicode-escape').encode('utf-8')
      str = '1. ' + str.split(' ')[2] + ' ' + str.split(' ')[3]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-08
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        相关资源
        最近更新 更多