在python中使用mechanize从网上拉下一张网页,使用read()读取页面内容后,print显示。在IDE(Eclipse)中直接运程序后,显示中文正常。但在Shell中测试时,read()后print的显示就是乱码了。
程序源码
from mechanize import Browser
br=Browser()
r=br.open("http://www.######.net")
s=r.read()
print s
运行后显示:
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta content="中国#######网上营业厅,中国########" name="keywords" />
一切正常,但在Shell中测试时,按行输入上述代码,显示却是:
'\xef\xbb\xbf<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n<html xmlns="http://www.w3.org/1999/xhtml">\r\n<head>\r\n <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r\n <meta content="\xe4\xb8\xad\xe5\x9b\.....
使用decode('utf8')转码后,显示仍为:
u'\ufeff<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n<html xmlns="http://www.w3.org/1999/xhtml">\r\n<head>\r\n <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r\n <meta content="\u4e2d\u56fd\....
多次查询后,发现问题在输出的前几个字符“'\ufeff”,去除这个字符后,显示就正常了。
假定使用如下语句获得输出:
s=r.read()
在shell中使用“print s.decode("utf-8")[1:]”,输出就正常了。
网上说明原因为:
某些软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),转码后是“'\ufeff”,因此我们在读取时需要自己去掉这些字符。