python读取中文乱码
‘壹’ 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
这样就可以了