python编解码问题记录

原始数据文件,采用的是UTF-8编码
在这里插入图片描述

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>表格比较(B)</title>
</head>
<body>
表格比较(B)<br/>
已产生: 2021/3/24 11:32:41<br/>
&nbsp; &nbsp;
<br/>
模式:&nbsp; 差异 &nbsp;
<br/>
左边文件: D:\codepath\kunlun_automation_bom\bom_system\数据库元器件信息_20210324113239.xlsx &nbsp;
<br/>
右边文件: D:\codepath\kunlun_automation_bom\bom_system\上传元器件信息_20210324113239.xlsx &nbsp;
<br/>
<br/>
</body>
</html>

from bs4 import BeautifulSoup
import codecs


r = codecs.open('admin.html', 'r', 'gbk', errors='ignore')

soup = BeautifulSoup(r, 'html.parser')
# print(soup.prettify())
w = soup.body.encode('utf-8')
with open('1.html', 'wb') as f:
    f.write(w)

w = soup.body.encode('gbk')
with open('2.html', 'wb') as f:
    f.write(w)


r2 = codecs.open('admin.html', 'r', 'utf-8')

soup = BeautifulSoup(r2, 'html.parser')
# print(soup.prettify())
w = soup.body.encode('utf-8')
with open('3.html', 'wb') as f:
    f.write(w)

w = soup.body.encode('gbk')
with open('4.html', 'wb') as f:
    f.write(w)

print(soup.body.encode('utf-8'))
print(soup.body.encode('gbk'))
print(soup.body)		# UnicodeEncodeError: 'gbk' codec can't encode character '\xa0'

结果输出
1.html
在这里插入图片描述

2.html
在这里插入图片描述

3.html
在这里插入图片描述

4.html
在这里插入图片描述
print 输出结果
在这里插入图片描述

print(soup.body)错误原因

原始文件采用的 UTF-8 即编码,使用 UTF-8 正确读取出来后,print 使用系统设置编码去显示字符, pycharm设置的字符显示编码默认使用的是 GBK 去编码字符显示,因此 print 输出显示的时候使用的是 GBK 去编码字符显示,字符 ‘\xa0’ 为 GBK 不支持因此导致 UnicodeEncodeError, 修改为 UTF-8 即可正常显示。查看终端输出编码设置 sys.stdout.encoding
在这里插入图片描述

读取的原始数据的时候,设定的编码方式不存在问题,后续在去 encode 也是正确的。

输出编码设置

sys.stdout.reconfigure(encoding='utf-8')
from __future__ import print_function
import sys

def safeprint(s):
    try:
        print(s)
    except UnicodeEncodeError:
        if sys.version_info >= (3,):
            print(s.encode('utf8').decode(sys.stdout.encoding))
        else:
            print(s.encode('utf8'))

safeprint(u"\N{EM DASH}")

参考:
https://www.cnblogs.com/vocus/p/11416022.html
https://www.cnblogs.com/-qing-/p/10934261.html
https://stackoverflow.com/questions/5419/python-unicode-and-the-windows-console/32176732#32176732
https://stackoverflow.com/questions/4374455/how-to-set-sys-stdout-encoding-in-python-3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值