vscode运行错误,但是python自带的idle和pycharm运行正常呢?

丶之乎者也 2020-08-04 10:35:09
import requests #调用requests库
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
#获取网页源代码,得到的res是response对象
print(res.status_code) #检查请求是否正确响应
html = res.text #把res的内容以字符串的形式返回
print(html)

上面这一串代码,在vscode运行编码错误,但是python自带的idle和pycharm运行正常呢?

python自带的idle运行正常如下:

查出问题可能出现在win7系统默认cmd的编码是GBK,
我将.py文件拖到cmd运行也是正常,

不知道是哪里出了问题,
另外vscode的launch.json文件运行,中文显示乱码:

公司电脑64位win7都正常,家里电脑32位的win7就有问题,刚入门请大神指教指教。
...全文
2119 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nibusi 2023-06-04
  • 打赏
  • 举报
回复

既然能运行,代码就没问题,vscode设置ok,请卸载vscode中你不小心安装的代码检查的扩展就好了。一堆垃圾检查扩展其实乱检查。我的代码也是,本来在其他地方都正常,放vscode一堆问题警告,还有一个什么错误。我把不小心安装的代码检查扩展卸载了就ok了。主要就是那个Flake8.流氓的代码检查扩展。一丢丢问题完全不影响的问题,都给你检查到不能运行。

crifan 2020-08-08
  • 打赏
  • 举报
回复
print(os.environ["PYTHONIOENCODING"])

中的:
os:表示Python中的os模块,os=Operating System=操作系统-》你当前的操作系统相关的库
environ:英文全称environment=环境变量 -》表示当前操作系统中的一些环境变量
PYTHONIOENCODING:Python的IO(输入输出)的encoding编码
-》
os.environ["PYTHONIOENCODING"]

用于去打印出当前操作系统中的环境变量PYTHONIOENCODING
-》你此处报错
KeyError,说明是:os.environ中没有这个PYTHONIOENCODING环境变量
-》可以不理会
也可以改为:
os.environ.get("PYTHONIOENCODING")

这样改为get后,即使没有这个环境变量,也不会报错,而只会返回None空

另外,你可以改为
print(os.environ)

可以看到当前其他还有哪些环境变量 -》 供你了解和学习。



丶之乎者也 2020-08-07
  • 打赏
  • 举报
回复
引用 1 楼 天不绝我 的回复:
首先,查看网页的编码格式 <meta charset="utf-8"> 然后 html= res.text.encode("网页用的什么编码,你就用什么编码解析") print(html)
尝试过用网页的utf-8来解析,但是解析出来成了字节。
丶之乎者也 2020-08-07
  • 打赏
  • 举报
回复
引用 4 楼 crifan 的回复:
引用
上面这一串代码,在vscode运行编码错误,但是python自带的idle和pycharm运行正常呢?
因为你此处的 html 字符串,是UTF-8 编码,而IDLE和PyCharm此处都是默认UTF-8 编码,编码一致,属于输出字符串正常 而VSCode中,你看到的内容,属于: VSCode的终端 = 你当前系统的自带终端, 但是好像默认的编码是GBK,编码不一致,所以输出报错。 如何解决: 尝试把字符串解码成unicode:
unicodeHtml = html.decode("UTF-8")
print(unicodeHtml)
(理论上输出那一刻unicode会自动去编码为,目标输出的编码格式,比如GBK或UTF-8等)再输出,估计就可以了 另外你的说的:
引用
vscode的launch.json文件运行,中文显示乱码
是错的做法: 1.launch.json本身是个(用于vscode配置当前项目的json格式的)普通的文本文件 -》 不是python代码 -》 所以不能用来运行 -》 你用来当成python代码去运行了,逻辑上就是错误的 2.如果非要去运行,那么对于“中文显示乱码”,你可以: 把你的launch.json改为 GBK的编码,则此处运行错误的时候,至少可以输出 不是乱码的中文字符了。你试试。 另外关于字符编码,可以参考我的 1. 先去了解背景知识 复杂的解释: 字符编码详解 简明的解释: 字符编码简明教程 – 在路上 2. 再去搞懂python中的字符编码 和常见错误及背后原因及解决办法 【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str – 在路上 Python专题教程:字符串和字符编码
import requests #调用requests库
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
#获取网页源代码,得到的res是response对象
print(res.status_code) #检查请求是否正确响应
html = res.text #把res的内容以字符串的形式返
unicodeHtml = html.decode("UTF-8")
print(unicodeHtml)
谢谢老师的指点, 我按照您说的方法试了,依然显示报错,html已经是字符串格式,无法再被decode('utf-8')解码。 我又尝试用utf-8 编码成字符串再用gbk解码,有一次中文是乱码,再试又是报错。 个人认为应该是我的vscode出了问题,如果说vscode默认编码位gbk, 为什么我在公司电脑上的vscode运行同样的代码正常呢, vscode我已经完全卸载重装三次了,人都快崩溃了已经。
crifan 2020-08-07
  • 打赏
  • 举报
回复
简答:

用:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='GB18030')


或:

sys.stdout.reconfigure(encoding='GB18030')


把此处终端输出编码改为,支持此处html中的(GBK编码不支持的)特殊字符© 的编码,比如GB18030,即可。

详解:
【已解决】Windows中VSCode中输出字符串到终端报错:UnicodeEncodeError gbk codec can’t encode character \xa9
丶之乎者也 2020-08-07
  • 打赏
  • 举报
回复
[quote=引用 8 楼 crifan 的回复:]又去看了看,目前有点怀疑: 你windows的cmd,可能本身是unicode了,所以不会报错。 而你VSCode时,内置的终端 默认是GBK,而其中某些字符不支持(因为本身GBK支持的字符就不是足够多,只是GB18030的子集) 所以建议: 把终端编码改为 BG18030 去看看效果,或许就可以了。 把终端输出编码改为GB18030: 方式1:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
方式2:
sys.stdout.reconfigure(encoding=‘GB18030’)
另外,为了调试确认编码的确已改,最好在之前和之后都加上:
print(“sys.stdout.encoding=%s” % sys.stdout.encoding)
以及: 其他查看一些信息
import sys, locale, os
print(sys.stdout.encoding)
print(sys.stdout.isatty())
print(locale.getpreferredencoding())
print(sys.getfilesystemencoding())
print(os.environ["PYTHONIOENCODING"])
-》这样便于调试清楚 更改编码 之前 和 之后,各个变量和编码是否有变化 具体是什么值 方便找出问题所在。
import sys, locale, os
print(sys.stdout.encoding)
print(sys.stdout.isatty())
print(locale.getpreferredencoding())
print(sys.getfilesystemencoding())
print(os.environ["PYTHONIOENCODING"])
另外您说的这几个查看信息的输出各是什么意思啊,刚入门真心求教。 我将最下面一个复制到VScode显示报错
丶之乎者也 2020-08-07
  • 打赏
  • 举报
回复
引用 8 楼 crifan 的回复:
又去看了看,目前有点怀疑: 你windows的cmd,可能本身是unicode了,所以不会报错。 而你VSCode时,内置的终端 默认是GBK,而其中某些字符不支持(因为本身GBK支持的字符就不是足够多,只是GB18030的子集) 所以建议: 把终端编码改为 BG18030 去看看效果,或许就可以了。 把终端输出编码改为GB18030: 方式1:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
方式2:
sys.stdout.reconfigure(encoding=‘GB18030’)
另外,为了调试确认编码的确已改,最好在之前和之后都加上:
print(“sys.stdout.encoding=%s” % sys.stdout.encoding)
以及: 其他查看一些信息
import sys, locale, os
print(sys.stdout.encoding)
print(sys.stdout.isatty())
print(locale.getpreferredencoding())
print(sys.getfilesystemencoding())
print(os.environ["PYTHONIOENCODING"])
-》这样便于调试清楚 更改编码 之前 和 之后,各个变量和编码是否有变化 具体是什么值 方便找出问题所在。
谢谢您的耐心解答,按您的思路将VScode默认GBK改为BG18030成功解决问题,
crifan 2020-08-07
  • 打赏
  • 举报
回复
又去看了看,目前有点怀疑:
你windows的cmd,可能本身是unicode了,所以不会报错。
而你VSCode时,内置的终端 默认是GBK,而其中某些字符不支持(因为本身GBK支持的字符就不是足够多,只是GB18030的子集)
所以建议:
把终端编码改为 BG18030 去看看效果,或许就可以了。

把终端输出编码改为GB18030:
方式1:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')


方式2:
sys.stdout.reconfigure(encoding=‘GB18030’)


另外,为了调试确认编码的确已改,最好在之前和之后都加上:
print(“sys.stdout.encoding=%s” % sys.stdout.encoding)


以及:
其他查看一些信息

import sys, locale, os
print(sys.stdout.encoding)
print(sys.stdout.isatty())
print(locale.getpreferredencoding())
print(sys.getfilesystemencoding())
print(os.environ["PYTHONIOENCODING"])


-》这样便于调试清楚 更改编码 之前 和 之后,各个变量和编码是否有变化 具体是什么值 方便找出问题所在。
crifan 2020-08-06
  • 打赏
  • 举报
回复
引用 3 楼 陈年椰子 的回复:
在程序第一行加句

#-*- coding:utf-8 _*-


这样试试。


此处声明编码,对问题,基本上没有任何帮助。

详见我(多年前写的)
【整理】Python中用encoding声明的文件编码和文件的实际编码之间的关系 – 在路上
crifan 2020-08-06
  • 打赏
  • 举报
回复
引用
上面这一串代码,在vscode运行编码错误,但是python自带的idle和pycharm运行正常呢?

因为你此处的 html 字符串,是UTF-8 编码,而IDLE和PyCharm此处都是默认UTF-8 编码,编码一致,属于输出字符串正常

而VSCode中,你看到的内容,属于:
VSCode的终端 = 你当前系统的自带终端, 但是好像默认的编码是GBK,编码不一致,所以输出报错。

如何解决:
尝试把字符串解码成unicode:

unicodeHtml = html.decode("UTF-8")
print(unicodeHtml)

(理论上输出那一刻unicode会自动去编码为,目标输出的编码格式,比如GBK或UTF-8等)再输出,估计就可以了

另外你的说的:
引用
vscode的launch.json文件运行,中文显示乱码

是错的做法:
1.launch.json本身是个(用于vscode配置当前项目的json格式的)普通的文本文件 -》 不是python代码 -》 所以不能用来运行 -》 你用来当成python代码去运行了,逻辑上就是错误的
2.如果非要去运行,那么对于“中文显示乱码”,你可以:
把你的launch.json改为 GBK的编码,则此处运行错误的时候,至少可以输出 不是乱码的中文字符了。你试试。

另外关于字符编码,可以参考我的


1. 先去了解背景知识

复杂的解释:
字符编码详解

简明的解释:
字符编码简明教程 – 在路上

2. 再去搞懂python中的字符编码 和常见错误及背后原因及解决办法

【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str – 在路上

Python专题教程:字符串和字符编码


陈年椰子 2020-08-05
  • 打赏
  • 举报
回复
在程序第一行加句
#-*- coding:utf-8 _*-
这样试试。
丶之乎者也 2020-08-05
  • 打赏
  • 举报
回复
有人遇到过这种情况吗
放风喽 2020-08-05
  • 打赏
  • 举报
回复
首先,查看网页的编码格式 <meta charset="utf-8"> 然后 html= res.text.encode("网页用的什么编码,你就用什么编码解析") print(html)

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧