zoukankan      html  css  js  c++  java
  • 怎么处理requests中的乱码问题

    长期专注于写爬虫,受够了urllib、urllib2甚至是urllib3。最后选择了更人性化的requests。可是requsests对中文的支持并不太好,时常会出现乱码问题。研究源码之后现给出解决方案。

    乱码的由来:requests的字符检测借用了一个名为chardet的第三方库,如果运行环境缺少这个库的话系统会从别的地方想办法猜测字符集,比如header中的是声明。其实这个第三库和补救的办法往往都不靠谱,而在转换unicode的过程又是通过str方法强制执行的。于是可恶的乱码就这么出现了。

    解决方案1:直接使用requests中response对象的content属性,content是未被转换成unicode的返回值。这样一来怎么解码就是调用方可以自己灵活处理的问题了

    解决方案2:对requests库进行hack自己写一套合适的字符集检测方法。我自己就是在ultis.py中添加了一个自己的get_encoding方法,然后在models.py中调用了它。

    get_encoding 方法实现如下,这个实现未必很完美但至少解决了问题

    def get_encoding(s):
        if isinstance(s,unicode):
            return "unicode"
        try:
            r = unicode(s)
            return "ASCII"
        except:
            try:
                r = s.decode("utf8")
                return "utf8"
            except:
                try:
                    r = s.decode("gbk")
                    return "gbk"
                except:
                    try:
                         r = s.decode("latin-1")
                         return "latin-1"
                    except:
                        pass

    -*-python之禅-*-

    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.

  • 相关阅读:
    Silverlight 控件绑定到对象
    开源编辑器Makedown的安装
    ASP.NET 4 和 Visual Web Developer 中的新增功能
    空间新闻模块CSS
    P2P之王者电骡Emule技术分析
    QQ向陌生人聊天的autoit脚本
    Er 一个开源游戏的诞生
    一个不错的源代码语法高亮插件dp.SyntaxHighlighter
    Aut2Exe编译au3脚本为可执行文件
    模拟:悬停和纯双点击移动设备的CSS
  • 原文地址:https://www.cnblogs.com/monxue/p/3063016.html
Copyright © 2011-2022 走看看