html怎么解决乱码问题Python3乱码问题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&请注意 gb2312 不是 “gb2312”,凡 gb2312 的请换成 gb18030.&微软将 gb2312 和 gbk 映射为 gb18030,方便了一些人,也迷惑了一些人。&&&即,实际上该网页是GB18030的编码,所以按照这里:(原始出处为:)的方法,传递GB18030给fromEncoding,才可以:&page = urllib2.build_opener().open(req).read()soup = BeautifulSoup(page, fromEncoding="GB18030")&&&而其中,也解释了,为何HTML标称的GBK的编码,但是却解析出来为windows-1252了:&最近需要写一个python的RSS抓取解析程序,使用了feed parser。但是对于百度新闻的RSS,其编码方式为gb2312,feed parser探测出来的编码却是windows-1252,结果中文内容都是一堆乱码。问题在于,并不是feedparser不能识别出gb2312编码,而是国人们往往将gb2312与gbk编码等同,某些已经使用了gbk编码里的字符的,仍然声称内容为gb2312编码。feedparser对gb2312编码严格遵循gb2312字符集范围,当探测到超出这一范围的字符,便将编码回退到windows-1252。由于百度的RSS实际使用的应该是gbk编码,里面含有超出gb2312范围的字符,于是feedparser便擅自决定了将编码退回windows-1252,导致了中文乱码的现象。&&&【总结】以后用python的Beautiful Soup去解析中文网页的话:1.如果本身网页的编码自己标称的,和本身其中文字符所用编码完全符合的话,即没有部分字符超出了其所标称的编码,比如标称为GBK,网页所有的内容,都的确是GBK编码,没有超出的其他字符(比如属于GB18030的编码),那么,是可以通过:& page = urllib2.urlopen(url)soup = BeautifulSoup(page)&#此处不需要传递参数,BeautifulSoup也完全可以自己去解析网页内容所使用的编码print soup.originalEncoding而得到真实的网页的编码的。&2.讨论中文乱码问题之前,先解释关于中文字符编码:时间上的发展先后是,GB2312,GBK,GB18030,编码技术上都是兼容的。从所包含的中文字符个数来说,算是:GB2312 & GBK & GB18030,也因此,才可能会出现上面所说的,标称GB2312的,部分字符用到了GBK里面的,或者是标称GBK的,部分字符用到了GB18030里面的,所以被人家编码工具解析错误,退回认为编码是最基本的windows-2152了。而我这里的情况就是属于后者,网易博客网页中,自己声称是GBK,但是很多中文字符用的是GB18030。总的说,现在实际情况是,由于编写网页代码的人所用的字符编码所不同,以及自己在网页中声称的编码和实际自己网页所用的编码不同,导致了中文网页出现乱码。所以,要先搞懂这些中文字符编码之间关系,以及历史上的逻辑前后关系,才可能解决这类问题。关于中文字符编码,更多详细解释请参考这里:中文字符编码标准+Unicode+Code Page&所以:(1)如果是网页标称为GB2312,但是部分字符用到了GBK的了,那么解决办法就是在调用BeautifulSoup,传递参数fromEncoding="GBK",即:&page = urllib2.build_opener().open(req).read()soup = BeautifulSoup(page, fromEncoding="GBK")(2)如果是网页标称为GBK,但是部分字符用到了GB18030的了,那么解决办法就是在调用BeautifulSoup,传递参数fromEncoding="GB18030",即:page = urllib2.build_opener().open(req).read()soup = BeautifulSoup(page, fromEncoding="GB18030")(3)实际上由于GB18030从字符数上都涵盖了GB2312和GBK,所以如果是上述两种任意情况,即只要是中文字符出现乱码,不管是标称GB2312中用到了GBK,还是标称GBK中用到了GB18030,那么都直接传递GB18030,也是可以的,即:&soup = BeautifulSoup(page, fromEncoding="GB18030")&&即可。
阅读(8511)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'【已解决】python中文字符乱码(GB2312,GBK,GB18030相关的问题)',
blogAbstract:'
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}16:43 提问
python3+websocket解析遇到中文乱码
握手成功后前端向服务器发送报文信息,信息内容有中文。解析过程中如何解决乱码问题?
msg = decode1(self.conn.recv(1024)) #接收报文
def decode(data):
if not len(data):
return False
length = data[1] & 127
if length == 126:
mask = data[4:8]
raw = data[8:]
elif length == 127:
mask = data[10:14]
raw = data[14:]
mask = data[2:6]
raw = data[6:]
for cnt, d in enumerate(raw):
ret += chr(d ^ mask[cnt % 4])
return ret
按赞数排序
把中文发送的时候统一用utf8编码。然后解码的时候解码回来。
浏览器websocket 发来的 带中文的解析乱码
def parse_recv_data(msg):
en_bytes = b''
cn_bytes = []
if len(msg) & 6:
v = msg[1] & 0x7f
if v == 0x7e:
elif v == 0x7f:
mask = msg[p:p + 4]
data = msg[p + 4:]
for k, v in enumerate(data):
nv = chr(v ^ mask[k % 4])
nv_bytes = nv.encode()
nv_len = len(nv_bytes)
if nv_len == 1:
en_bytes += nv_bytes
en_bytes += b'%s'
cn_bytes.append(ord(nv_bytes.decode()))
if len(cn_bytes) & 2:
# 字节数组转汉字
cn_str = ''
clen = len(cn_bytes)
count = int(clen / 3)
for x in range(0, count):
b = bytes([cn_bytes[i], cn_bytes[i + 1], cn_bytes[i + 2]])
cn_str += b.decode()
new = en_bytes.replace(b'%s%s%s', b'%s')
new = new.decode()
res = (new % tuple(list(cn_str)))
res = en_bytes.decode()
return res
def parse_recv_data(msg):
en_bytes = b''
cn_bytes = []
if len(msg) & 6:
v = msg[1] & 0x7f
if v == 0x7e:
elif v == 0x7f:
mask = msg[p:p + 4]
data = msg[p + 4:]
for k, v in enumerate(data):
nv = chr(v ^ mask[k % 4])
nv_bytes = nv.encode()
nv_len = len(nv_bytes)
if nv_len == 1:
en_bytes += nv_bytes
en_bytes += b'%s'
cn_bytes.append(ord(nv_bytes.decode()))
if len(cn_bytes) & 2:
# 字节数组转汉字
cn_str = ''
clen = len(cn_bytes)
count = int(clen / 3)
for x in range(0, count):
b = bytes([cn_bytes[i], cn_bytes[i + 1], cn_bytes[i + 2]])
cn_str += b.decode()
new = en_bytes.replace(b'%s%s%s', b'%s')
new = new.decode()
res = (new % tuple(list(cn_str)))
res = en_bytes.decode()
return res
其他相关推荐
其他相似问题问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import requests
def run():
soup = requests.get('/gongshi2014/index.html').text
soup = BeautifulSoup(soup,'html.parser')
soup = soup.find('tbody')
for x in soup.find_all('tr'):
for y in x.find_all('td'):
s = y.a.text
if __name__=="__main__":
读取之后的内容不知道是不是gbk被当成UTF-8来处理了求教
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
个人建议获取response时,按照response里指定的编码格式把字符串解析了
def run():
r = requests.get('/gongshi2014/index.html')
soup = r.text.encode(r.encoding) #这里获取的text先按照指定的字符集解析下,这样gbk、utf8都可以了
soup = BeautifulSoup(soup, 'html.parser')
soup = soup.find('tbody')
for x in soup.find_all('tr'):
for y in x.find_all('td'):
s = y.a.text
大连理工大学
沈阳工业大学
沈阳航空航天大学
沈阳理工大学
辽宁科技大学
辽宁工程技术大学
辽宁石油化工大学
沈阳化工大学
大连交通大学
大连海事大学
大连工业大学
沈阳建筑大学
辽宁工业大学
沈阳农业大学
大连海洋大学
中国医科大学
辽宁医学院
大连医科大学
辽宁中医药大学
沈阳药科大学
辽宁师范大学
沈阳师范大学
鞍山师范学院
大连外国语大学
东北财经大学
沈阳体育学院
沈阳音乐学院
鲁迅美术学院
辽宁对外经贸学院
辽宁科技学院
沈阳工程学院
大连民族学院
大连理工大学城市学院
沈阳工学院
大连工业大学艺术与信息工程学院
大连科技学院
沈阳城市建设学院
大连医科大学中山学院
辽宁医学院医疗学院
辽宁师范大学海华学院
辽宁理工学院
大连财经学院
沈阳城市学院
大连艺术学院
辽宁何氏医学院
沈阳化工大学科亚学院
大连东软信息学院
辽宁财贸学院
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你好!我也遇到过类似问题。解决办法 print(s) 改为 print(s.encode('latin1').decode('utf-8'))即可这是运行结果:
Good Luck!
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
用python测试了一下sqlite,从txt读取数据插入sqlite,结果在sqlite表里面显示乱码,从sqlite取出来在python显示又正常,求高手解释一下什么情况。编码应该怎么设置
#_*_coding:gb18030_*_
& && &&&cn = sqlite3.connect('sqlite.db')
& && &&&f = open('E:/jquery/数据库test/data/data.txt','r')
& && &&&cn.text_factory = str& &
& && &&&cur = cn.cursor()
& && &&&for line in f:
& && && && &s = line.split('|')
& && && && &cur.execute('insert into userinfoss values(?,?,?,?)',(s[0],s[1],s[2],s[3]))
& & except Exception,e:
& && &&&print e
& & cn.commit()
& & cur.close()
& & cn.close()
1.jpg (47.04 KB, 下载次数: 1)
18:08 上传
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 119, 距离下一级还需 81 积分
论坛徽章:0
sqlite数据库默认使用utf-8编码
你使用的data.txt文件一般情况下是使用的gbk或者类似编码
在写入数据库的时候转换一下编码:
insert into userinfoss values(?,?,?,?)',(s[0].decode('gbk').encode(utf-8'),s[1].decode('gbk').encode(utf-8'),s[2].decode('gbk').encode(utf-8'),s[3].decode('gbk').encode(utf-8'))
当你从sqlite读出内容需要显示的时候,&&可以再转换回来:& &s0 = s0.decode('utf-8').encode('gbk') ,&&(对于支持utf-8文本显示的编辑器不需要进行转换)
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
可以了,非常感谢!回复
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
还有一个问题,我像下面这样从dos输入中文来查就不行了
& && && && &name = str(raw_input('要查找的人&'))& && && &&&
& && && && &if name == '0':break
& && && && &cur.execute('select * from userinfoss where a1 = ?' , (name.decode('gbk').encode('utf-8')))
这样提示:&&
cur.execute('select * from userinfoss where a1 = ?' , (name.decode('gbk').encode('utf-8')))
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 9 supplied.
这个是什么错误呢?拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(39ccba4-ua98).
重新安装浏览器,或使用别的浏览器

我要回帖

更多关于 如何解决乱码问题 的文章

 

随机推荐