下载小说时,python字符集编码utf-8和GBK的错误处理(慎!)

创作背景

    今天想找本小说看,但是居然只能在网页上能找到资源,作为一名测试工程师,这能忍?多么严重的体验,这还能一起愉快的玩耍了吗?还能好好摸鱼了吗?

    果断花点时间,查看页面结构,写个脚本自动请求网页,获取小说内容,并进行储存到本地txt文件中,放在手机里,躺在床上慢慢看。没想到,来回调试了好几次,o(╯□╰)o。

    好吧,工作都没这么热情,果然爱好才是第一生产力。\(^o^)/~

遇见问题

    大部分的网页都是utf-8编码,所以在进行请求和写入文件中时,不会出现乱码的问题。但不包括所有网页都是如此,有些网页会采用的GBK形式编码,这种情况下,网页正文内容中还使用如 形式来代替 【不换行空格】。当两者buff叠加,因为写入文件时,GBK编码不认识 ,运行时会出现报错,导致中断。等了十几分钟,美滋滋准备打开文件看小说时,发现一章没下了,那种心情。家人们,谁懂啊,泪如雨下啊有木有。废话较多,进入正题。

原文

with open("123.txt", 'a', encoding="GBK") as f:
    f.write(a)
    f.write('\n')
    f.write(content)
    f.write('\n')

报错信息

Traceback (most recent call last):

    File "D:/pyproject/xiaoshuo/xiaoshuo2.py", line 215, in

      f.write(content) UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 3: illegal multibyte sequence

修改后

with open("123.txt", 'a', encoding="GBK") as f:
    f.write(a)
    f.write('\n')
    try:
        f.write(content)
    except UnicodeEncodeError:
        # 如果遇到编码错误,则尝试转换编码
        encoded_content = content.encode('GBK', errors='replace')
        safe_content = encoded_content.decode('GBK').replace('????????', '\n')
        f.write(safe_content)
        f.write('\n')
    f.write('\n')

代码解释

content.encode('GBK', errors='replace')  表示将content对象以GBK形式进行编码,其中的错误以默认的字符进行替换(默认字符是?)

我这里经对比 页面结构和转换后的结果后,发现是引用了4个 ,给我默认替换成了????????,为了下载后的结构美观,将其换成了换行空格

后续

之后,研究了下python的编译打包功能,生成了一个执行文件,双击即可使用,连pycharm编辑器都不用打开了,即输即用,后台运行。配上日志输出,发生错误时,记录报错问题便于后续排查和断点继续下载。w(゚Д゚)w,妈妈再也不用怕我看不了小说了。

下篇文章记录python的编译打包功能

你可能感兴趣的:(python)