当前位置:首页 » 编程语言 » python读取中文乱码

python读取中文乱码

发布时间: 2024-04-30 16:27:13

‘壹’ python编程中中文输出乱码UnicodeEncodeError: 'ascii' codec can't encode character

楼主你好!肆余

其实按照你的代码的逻辑来做是没有错的,无法显示成utf-8编码的文本其实是因为在request请求的时候,按照网页的标识转了码,接着BeautifulSoup把已经是utf-8的文本又强转了一次utf-8编码,导致了无法正确的显示,以想要拿到的尘银时间为例,其实程序的目标字符串应该如下:

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

'''我们想要使用的字符串'''
target_str=':53'

'''两次转码后的字符串'''
get_str=u':53'


归根结底是两个对象的类不同,但python不支持这两种类型的强转,个人想了个比较临时的解决方案,算是个python打了个补丁,就是将字符串转成二进制,再转回字符串,这样就unicode就不用给他加上编码方式再转成二进制字符串了,修改后的代码如下:

#-*-coding:utf-8-*-
importrequests
frombs4importBeautifulSoup
fromdatetimeimportdatetime

defencode(s):
'''将字符串转成二进制'''
return''.join([bin(ord(c)).replace('0b','')forcins])

defdecode(s):
'''将二进制转换成字符串'''
return''.join([chr(i)foriin[int(b,2)forbins.split('')]])

res=requests.get('
)
res.encodeing='utf-8'

soup=BeautifulSoup(res.text,'html.parser')

'''每个中文字符都进行转换处理'''
title=decode(encode(soup.select('#artibodyTitle')[0].text))
time=decode(encode(soup.select('.time-source')[0].contents[0].strip()))

chinese='%Y年%m月%d日%H:%M'
timesource=datetime.strptime(time,chinese)
print(title)
print(timesource)

看楼主在研究的过程中,对字符串的编码原理的理解还有所欠派雹宴缺,这方面的资料在网上很多,可以再自行研究一下,能够获得长足的进步。

望采纳,谢谢!

‘贰’ Python+requests 爬取网站遇到中文乱码怎么办

1. 遇到的中文乱码问题
1.1 简单的开始
使用requests来拔取网站内容十分方便,一个最简单的代码段只需要2-3行代码就行。

点击(此处)折叠或打开

  • url='http//www.pythonscraping.com/'

  • req= requests.get(url)

  • print(req.text)

  • tree= html.fromstring(req.text)

  • print(tree.xpath("//h1[@class='title']/text()"))

  • 上面的代码段起作用的也就3行(2,4,5)代码就获取到我们想要的内容。当然还要导入一系列的包,比如说requests、lxml、html等。当然由于http//www.pythonscraping.com/是英文网站,不存在中文乱码问题。

  • 1.2 麻烦的开始

  • 本来当时的想法是写一些基础模块,方便之后开发的时候调用,减少重复性工作。为了保证代码在任何情况下都不会出现bug,所以想着用同样的代码爬取中文网站获取里面的文字

  • 修改上面代码中的两行代码:

  • 点击(此处)折叠或打开

  • url='http://sports.sina.com.cn/g/premierleague/index.shtml'

  • print(tree.xpath("//span[@class='sec_blk_title']/text()"))

  • 运行程序可以发现,在语句print(req.text)输出的内容中,中文字体已经是乱码了。最后的结果输出是['?????©è§x86é?x91', '??x80?x9cx9f?x9bx9eé??']

  • 2 乱码解决办法

  • 2.1 试错

  • 由于之前爬取csdn上一个网页没有出现乱码问题,但是在sina体育网站上出现了乱码,所以当时以为不是编码问题,以为是文档压缩问题。因为csdn获取的页面header里没有“Content-Encodings”属性,但是sina体育获取的页面header有“Content-Encodings”属性--“Content-Encoding: gzip”。




  • 总结:参考上述文献,结果还是没有解决问题,但是就考虑是不是方向错了。不过这部分工作也没有白做,很多网站返回数据都会有压缩问题,之后的工作中也能用上。


  • 2.2 乱码终极解决办法

  • 后来查阅官方文档中response-content相关内容,说明了Requests会自动解码来自服务器的内容。Requests会基于HTTP头部对响应的编码作出有根据的推测,前提是响应文档的HTTP headers里面没有相关字符集说明。官方文档还说明了,如果你创建了自己的编码,并使用codecs模块进行注册,你就可以轻松地使用这个解码器名称作为r.encoding的值, 然后由Requests来为你处理编码。(自己没有使用codecs模块,所以这里不贴代码了,不过按官方的说法使用codecs模块是最简单的一种方式。)

  • 另一份官方文档片段明确说了reponse编码处理方式:

  • Requests遵循RFC标准,编码使用ISO-8859-1 。

  • 只有当HTTP头部不存在明确指定的字符集,并且Content-Type头部字段包含text值之时, Requests才不去猜测编码方式。


  • 现在直接上实验结果,在原始代码中添加以下代码片段:

  • 点击(此处)折叠或打开

  • print(req.headers['content-type'])

  • print(req.encoding)

  • print(req.apparent_encoding)

  • print(requests.utils.get_encodings_from_content(page_content.text))

  • 输出结果分别是:

  • text/html

  • ISO-8859-1#response内容的编码

  • utf-8#response headers里设置的编码

  • ['utf-8']#response返回的html header标签里设置的编码

  • 返回的内容是采用‘ISO-8859-1’,所以出现了乱码,而实际上我们应该采用‘utf-8’编码


  • 总结:当response编码是‘ISO-8859-1’,我们应该首先查找response header设置的编码;如果此编码不存在,查看返回的Html的header设置的编码,代码如下:

  • 点击(此处)折叠或打开

  • if req.encoding=='ISO-8859-1':

  • encodings= requests.utils.get_encodings_from_content(req.text)

  • if encodings:

  • encoding= encodings[0]

  • else:

  • encoding= req.apparent_encoding

  • encode_content= req.content.decode(encoding,'replace').encode('utf-8','replace')

‘叁’ python读取中文目录出现乱码

先对路径进行unicode处理,然后再打开。举例:

inpath = 'E:\MyProject\SVN_Project\Drawingboard_local\model\mydata\input\proction\示波器\0.htm'
uipath = unicode(inpath, "utf8")
然后用"uipath"经过编码后的路径去open()即可:
fin = open(uipath)

‘肆’ python中文显示乱码,已经在开头有了coding: utf-8

乱码原因:
因为你的文件声明为 utf-8,并且也应该是用 utf-8 的编码保存的源文件。但是 windows 的本地默认编码是 cp936,也就是 gbk 编码,所以在控制台直接打印 utf-8 的字符串当然是乱码了。

解决方法:

py文件用记事本打开,另存为utf-8格式即可

‘伍’ python 中文乱码问题

记事本是用utf-8保存你下载了东西的。你下载下来的不是utf-8,保存下来中文当然就乱码了。而gbk和utf-8里英文的编码值都一样,所以不受影响。

一个方法是你留意下目标页面的charset 和 contentType,另一个方法是你复制一个目标页面的字,放cmd里看它的编码长度,以此来判断它的原来编码。

‘陆’ python 用os.walk()遍历目录时,中文文件名显示为乱码

#coding=gb18030

import os,sys

def processunicode(value): #定义一个处理unicode类型字符串的函数
v1=''
for a in value:
if type(a)=='unicode':
v1=v1+str(a.encoe('gb18030'))
else:
v1=v1+str(a)
return v1

print processunicode(export) #把要打印的参数传给该函数,并打印出来

‘柒’ python命令行输入中文乱码怎么办

python2.X,代码中指定了UTF-8,但是在cmd命令行窗口时,打印的中文仍然会乱码。

在python3不存在该问题

运行结果:

原因

中文windows默认的输出编码为gbk ,与脚本中定义的UTF-8不一样,所以出现了解码失败的情况。

相关推荐:《Python基础教程》

解决方法

有如下两种方法可以解决这个问题

方法一

我们可以通过先把中文解码为unicode,然后再转化为gbk来解决这个问题:

修改后运行结果:

方法二

当然,我们也可以通过改变cmd命令行窗口的输出格式来解决这个问题:

·chcp 65001 就是换成UTF-8代码页

·chcp 936 可以换回默认的GBK

但是这样就降低了脚本的兼容性,在其他环境运行的时候可能还会出现这样的错误,而且可能会影响其他脚本运行,所以推荐使用第一种方法。

‘捌’ python print中文乱码问题 win10 Python2

python2字符串编码的问题,如果要输出中文可以使用u前缀,这样就可以直接使用了

a=u'你好'
printa

这样就可以了

热点内容
电脑主机做服务器下载快不 发布:2024-11-28 00:32:40 浏览:386
冷冻存储盒 发布:2024-11-28 00:21:04 浏览:127
达内幼儿编程 发布:2024-11-28 00:21:02 浏览:320
我的世界下100层是什么服务器 发布:2024-11-28 00:16:50 浏览:548
怎么改配置密码 发布:2024-11-28 00:16:44 浏览:113
服务器芯片v几是什么 发布:2024-11-28 00:15:37 浏览:599
家庭麦克需要什么配置才能用 发布:2024-11-28 00:05:28 浏览:384
c语言then是什么意思 发布:2024-11-27 23:54:07 浏览:195
提升访问 发布:2024-11-27 23:41:39 浏览:821
为什么学习编程 发布:2024-11-27 23:41:37 浏览:942