【问题标题】:python3 TypeError: a bytes-like object is required, not 'str' htmlpython3 TypeError:需要一个类似字节的对象,而不是'str' html
【发布时间】:2020-11-11 14:44:16
【问题描述】:

以下代码在python2.7中完美运行

for thepkg in mypkgs.get('package'):
    pkgname = thepkg.get('name').encode('utf-8').replace(' ', '_')
    print('                             <option value="'+pkgname+'">'+pkgname+'</option>')

但在 python3 中它会抛出错误

    pkgname = thepkg.get('name').encode('utf-8').replace(' ', '_')
TypeError: a bytes-like object is required, not 'str'

我尝试了各种变体,但是当 thepkg.get('name') 值是非英文字符串(例如日文或中文名称)时,会弹出不同的错误或呈现的 HTML 页面无法正确显示。再次,它在 python2.7 上的 HTML 中完美运行

【问题讨论】:

  • str.encode 在 Python 3.x 上的输出是一个 bytes 对象。 bytes.replace 要求参数也是 bytes 对象。阅读例如docs.python.org/3/whatsnew/…。还要看各种stackoverflow.com/…
  • pkgname = thepkg.get('name').encode('utf-8').decode() 显示 pkgname 现在是一个 str 对象(我删除了替换,以免进一步混淆) ,但 print() 仍然没有显示正确的 HTML
  • 添加更多。如果在命令行上执行脚本,它会正确显示。只是浏览器无法以某种方式正确解释它

标签: python-3.x python-2to3


【解决方案1】:

该问题是由 HTML 上的 sys.stdout.encoding 设置为 ANSI_X3.4-1968 引起的 当我使用

将编码重置为utf-8
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

在 print() 之前,HTML 中的字符开始正常显示

我也不需要使用 .encode('utf-8'),因为默认情况下 pkg.get('name') 是一个 unicode 字符串

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多