首頁  >  問答  >  主體

字符编码 - python使用split(‘中文字符’)出错

根据网页所给的字符编码将其字节数据decode('gb2312')
用的是scrapy,从给出的url获取body

def parse(self, response):
    body = response.body.decode('gb2312')
    print(body)    
    学分:1.5 # body就是这样之类的,中间的冒号是中文的冒号
    # 想弄成的效果就是['学分','1.5']
    body = body.split(':') # 就这样使用中文的冒号符来分割,但是出错
SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xa3 in position 0: invalid start byte

请问怎么解决?

PHP中文网PHP中文网2741 天前1025

全部回覆(4)我來回復

  • 大家讲道理

    大家讲道理2017-04-18 09:06:39

    # 我尝试了这样做
    print(body.encode('gb2312'))
    print(body.encode('utf-8'))
    输出如下:
    b'\xb3\xd0\xb5\xa3\xb5\xa5\xce\xbb\xa3\xba\xd5\xfe\xb7\xa8\xd1\xa7\xd4\xba'
    b'\xe6\x89\xbf\xe6\x8b\x85\xe5\x8d\x95\xe4\xbd\x8d\xef\xbc\x9a\xe6\x94\xbf\xe6\xb3\x95\xe5\xad\xa6\xe9\x99\xa2'
    #再令两个结果分别为gb2312和utf8
    >>> gb2312.decode('utf-8')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
    

    再看看上面的錯誤,是byte 0xa3
    於是我在終端上試了幾次,結果發現冒號的gb2312 encode

    >>> b'\xa3\xba'.decode('gb2312')
    ':'
    

    所以應該是python拿預設的utf-8來decode gb2312的body, 所以我能想到的一個辦法就是修改預設編碼值,也就是第一行的聲明:# -*- coding: gb2312 -*-
    然後運行果然成功,請問還有沒有別的方法?

    回覆
    0
  • 迷茫

    迷茫2017-04-18 09:06:39

    Python3

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:06:39

    decode後,body應該是unicode編碼,使用下面的方式即可:

    body = body.split(u':')

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:06:39

    又是一個編碼的問題,可以參考:人機互動之字符編碼和 五分鐘戰勝 Python 字符編碼。

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    # 模仿你从网页获得的数据
    data = "学分:1.5".decode("utf-8").encode('gb2312')
    # data = u"学分:1.5".encode('gb2312')
    print type(data)
    
    body = data.decode('gb2312')
    print type(body)    # unicode 类型
    
    # 两种解决方案
    print body.split(u':')  # unicode 对应 unicode
    print body.encode("utf-8").split(":")  # utf-8 对应 utf-8
    

    回覆
    0
  • 取消回覆