解决python中遇到的乱码问题

2017/12/15 技术

解决python中遇到的乱码问题

1. 解决中文乱码的一种可行方法

# -*- coding:utf-8 -*-
from __future__ import unicode_literals

import chardet


def smart_decoder(raw_content, default_encoding_list=("utf-8", "gb18030")):
    """
    将字符串解码成unicode
    :type default_encoding_list: list of str
    :rtype: unicode
    :type raw_content: str|unicode
    """
    if isinstance(raw_content, unicode):
        return raw_content

    encoding = chardet.detect(raw_content).get("encoding", "utf-8")

    try:
        return raw_content.decode(encoding)
    except UnicodeEncodeError as e:
        for encoding in default_encoding_list:
            try:
                return raw_content.decode(encoding)
            except UnicodeEncodeError as e:
                pass
        raise e


if __name__ == '__main__':
    import requests

    a = requests.get("https://www.baidu.com").content
    print(smart_decoder(a))

2. requests响应结果乱码

问题

使用requests请求网址,获取响应response, 通过response.text得到的网页内容,有时候会出现乱码的情况。

原因

分析源代码发现,调用respose.text 其实就是对 response.content执行解码操作。编码通过chardet判断。

乱码的关键是,chardet获取的编码可能不正确,但在执行response.content.decode时,程序会直接忽略编码异常,从而导致使用错误的编码解码。

解决思路

人工解码,处理编码错误。

程序demo

def parse_response(response):
    """
    手工对requests的响应内容解码
    :rtype: unicode
    """
    return smart_decoder(response.content)

Search

    Table of Contents