Python3 编码问题

2016-11-15 01:12:31 +08:00
 domino

我的系统为繁体中文 Win7 64bit / Python35 (32bit)
不知道为何下列程序,遇到简体,执行后会有错误.
请问该怎解决呢?

程序码

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://home.baidu.com/")
soup = BeautifulSoup(html , "lxml")
print(soup.title);

错误如下

C:\py>hellokitty.py
Traceback (most recent call last):
  File "C:\py\hellokitty.py", line 5, in <module>
    print(soup.title);
UnicodeEncodeError: 'cp950' codec can't encode character '\u5173' in position 7:
 illegal multibyte sequence
4706 次点击
所在节点    Python
26 条回复
jy02201949
2016-11-15 01:26:34 +08:00
这种一般都是 windows 的锅, cmd 太蛋疼了,自己建个虚拟机跑吧
hard2reg
2016-11-15 01:32:18 +08:00
建议用 IDLE ,别用蛋疼的 cmd 。
hard2reg
2016-11-15 01:33:32 +08:00
或者先在 CMD 执行这个 chcp 65001
Arthur2e5
2016-11-15 02:40:41 +08:00
Windows 控制台默认使用目前系统编码,对于繁体中文是 Big5/cp950 。 Python 在 print 一个字符串之前,需要编码到目前 cmd 窗口使用的编码,而你遇到了个( Python 印象中的) Big5 没有的字符。(之所以强调可能是 Python 的错觉,是因为这个语言的官方实现对于编解码的实现经常拘泥“标准”到脱离现实的地步: cp936 直接指到 gbk 结果没有该有的欧元符号、 cp950 没有 HKSCS 支持……)

你可以使用 chcp 65001 切到 utf-8 控制台窗口,当然也可以像楼上建议的一样走路绕开 Windows 控制台。
TaMud
2016-11-15 02:55:08 +08:00
import

try:
reload(sys)
sys.setdefaultencoding("utf-8")
except:
pass

试一下看看
XYxe
2016-11-15 08:14:00 +08:00
@TaMud Python3 没有 reload 吧
jhaohai
2016-11-15 08:58:27 +08:00
不要在 win 下搞这些,你会生不如死
justou
2016-11-15 09:09:12 +08:00
如果不想去动 CMD, 且控制台输出仅做简单观测可以这样:

# -*- encoding: utf-8 -*-

import locale
lc = locale.getpreferredencoding()

s = 'GBK 控制台不能完全显示的表情(*●⁰♊⁰●)ノ'


def show_msg(msg):
# print(msg) # 注释掉后: UnicodeEncodeError: 'gbk' codec can't encode ...
print(msg.encode(lc, 'ignore').decode(lc))

show_msg(s) # GBK 控制台不能完全显示的表情(*●●)

这将忽略掉本地编码不能显示的字符, 如果要精确记录就用 utf8 编码输出到文件
init
2016-11-15 09:29:19 +08:00
别用 win 写 python 我就遇到这个坑,没解决,后来又遇到许多安装包无法安装的坑,解决了一部分
最后的解决方法
装了个 ubuntu 。。。
真心的装个 linux 吧不然后面会遇到更多的坑的
domino
2016-11-15 09:58:48 +08:00
感谢各位协助~因刚买了一本网路采集在学 py,问题比较多.

再请问下,难道 python 抓取的 html 含有简体 /繁体
一定都得在 IDLE 上运行,才不会有编码的问题吗?

不知道是否有没通用的方法,不用經過 chcp 65001 ,让 CMD 可以顺利显示各种语言.
这样脚本给别人,在 win 运行也方便.
mahone3297
2016-11-15 10:06:32 +08:00
不是混充跨平台码?

看到大家说换到 linux 上。我之前,在 win 上写脚本,脚本功能是想 move 一些文件。然后,目录是中文。
问题:如果我的 php 脚本是 utf8 编码,那没效,因为目录名包含中文, win 上是 gbk 编码
最后我的解决方案是,在 linux 上挂在 win 解决。大家有其他解决方案码?
imn1
2016-11-15 10:20:04 +08:00
“给别人用”本身就不方便,别人还要配相同 py 环境
不同 win 的 codepage 编码就更加了

通用方法
1.统一环境开发
2.程序内部做兼容转码
3.统一使用环境( cmd 注册表改成 65001 ),但这个影响用户其他 cmd 使用
4.win10/ bash on ubuntu on windows
imn1
2016-11-15 10:23:17 +08:00
@mahone3297
我就是 win 从 php4 等到 php5.3 都没有 unicode 处理目录,才开始学 python 的
Arnie97
2016-11-15 10:25:00 +08:00
@TaMud @XYxe
加上 from importlib import reload 基本上就是楼主需要的答案

@justou 你说的方案在大多数场景下很好用,但不适合楼主。他的系统代码页是繁体,会导致很多简体字显示不出来,而不只是几个无关紧要的符号
raysonx
2016-11-15 10:42:41 +08:00
Windows 默认命令行的锅,用 PowerShell 吧。
mahone3297
2016-11-15 11:19:45 +08:00
@imn1 所以, python 能完美解决这个问题是么?我去试试
imn1
2016-11-15 11:28:21 +08:00
@mahone3297
补充一下,是 py3 , py3 读取多字节 win 路径是返回 utf-8 的,无需使用 win 的相关模块

这个知识不知道是否过时:
win 系统编码很复杂,例如 win 是 cp936(接近于 gbk)编码,如果一个路径含有中文、英文、韩文,它是一个混合编码,一般需要一些 win 相关的模块处理
py3 能统一返回 utf-8
qweweretrt515
2016-11-15 11:51:22 +08:00
https://www.v2ex.com/t/320624 同病相怜,借地方求助下
TaMud
2016-11-15 14:34:10 +08:00
关键的一句
sys.setdefaultencoding("utf-8")
剩下的自已查手册文 档就行了
jy02201949
2016-11-15 14:57:19 +08:00
@qweweretrt515 我觉得在 win 下调试代码最好还是用虚拟机, bash on ubuntu on win 应该也能解决这个问题,不过我没用过,好多人用过都说不错,可以在 win 上跑很多 linux 的东西了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/320544

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX