首页 > 将Unicode以utf-8的时候保存到文件的时候经常报错

将Unicode以utf-8的时候保存到文件的时候经常报错

方法1

def get_html(url):
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
            "Connection":"keep-alive",
        }
        r = requests.get(url,headers = headers)
        return r.text
    except Exception,ex:
        return None

问题:requests会自动替解码成Unicode吧,但是,为什么如果直接将上述函数返回的结果写入以utf-8的格式写入文件(write_file)的时候,经常会报错(常见的编解码错误)。

html=get_html("xxxxx")
write_file("a.html",html)
def write_file(file_name,content,mode="wb",encoding="utf-8"):
    with codecs.open(file_name,mode=mode) as f:
        f.write(content.encode(encoding,"ignore"))

但是,如果使用以下代码的话,就不会报错:

方法2

def get_html(url):
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
            "Connection":"keep-alive",
        }
        r = requests.get(url,headers = headers)
        return r.text.encode(r.encoding,"ignore")
    except Exception,ex:
        return None
html=get_html("xxxxx")
html = html.decode(chardet.detect(html)["encoding"],'ignore')
write_file("a.html",html)

首先,先使用get_html返回编码过的字符串(什么编码不清楚),接下来使用chardet对html解码成Unicode。
此时的Unicode直接通过write_file写入文件的时候,是可以正常保存为utf-8无BOM的。
但是使用方法1的话,时常会报错。
问题1:同样是Unicode,为什么在出现上述2中不同的情况?
问题2:在不使用chardet的情况下,还有什么解决办法吗(主要是chardet判断字符编码的时候很慢)

【热门文章】
【热门文章】