参考原文:http://www.crifan.com/eclipse_pydev_console_messy_char_for_console_is_utf8/

通用

rq = urllib.urlopen(url)

respHtml = rq.read()

respInfo = rq.info()

if("Content-Encoding" in respInfo):
if "gzip" == respInfo['Content-Encoding']:
respHtml = zlib.decompress(respHtml, 16+zlib.MAX_WBITS)
elif "deflate" == respInfo['Content-Encoding']:
respHtml = zlib.decompress(respHtml, -zlib.MAX_WBITS)

如果出现 --- u'\xe4\xbb\x8a\xe5\xa4\xa9' 这种情况:

str1 = u'\xe4\xbb\x8a\xe5\xa4\xa9'
print str1.encode('latin1').decode('utf8') 解这个问题的 tricky 之处在于利用这个特性: 
Unicode codepoints U+0000 to U+00FF all map one-on-one with the latin-1 encoding  先将 unicode 字符串编码为 latin1 字符串,编码后保留了等价的字节流数据。 
而此时在这个问题中,这一字节流数据又恰恰对应了 utf8 编码,因此对其进行 utf8 解码即可还原最初的 unicode 字符。 
不过值得注意的是,需要确定的是形如\xe8\xb4\xa2 究竟是 utf8 编码还是类似 gbk 的其他类型编码, 
这一点对于最终正确还原 unicode 字符也是同样重要的。 

出现原因参考:http://stackoverflow.com/questions/9845842/bytes-in-a-unicode-python-string

python3 中使用  unicode_escape

print('英国'.encode("unicode_escape"))
>>> b'\\u82f1\\u56fd'

如果是 '\\x\\x\\x' 这种类型 可以通过以下两种方式

a = '5424gdfg\\x63\\x73\\x4b\\x48\\x77\\x71\\x4d\\x49'
print(text.encode().decode('unicode_escape'))
import ast
a = '"' + a + '"'
print(ast.literal_eval(a))

URLEncode 与 unquote

from urllib import unquote

例如:http://fz.letfind.com/fang/citylist.asp

可以直接用unquote解码,但是 %u4E09%u660E 这种是不能转码的。

参考:http://bbs.htpc1.com/thread-92901-1-1.html

解码方法:先用替换将字符串"%uxxxx%uxxxx"转化为"u'\uxxxx\uxxxx'",然后用eval函数强制转换为unicode

aaa = '%u4E09%u660E'
bbb=eval("u'"+aaa.replace("%","\\")+"'")
print bbb

备注:eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果

顺带提供一个编码方法,以后一样用得到:

a = "我是中国人"
b = ''
for item in a.decode("utf8"):
b = b + "%u" + "%x" % ord(item)
print b

备注:
(1)ord()函数返回对应的ASCII数值,或者Unicode数值
(2)%是格式化运算符,%x 无符号十六进制整数,a~f采用小写形式;%X 无符号十六进制整数,A~F采用大写形式

alert('\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6\u8BE5\u623F\u6E90\u4FE1\u606F\uFF0C\u8BF7\u7A0D\u540E\u5C1D\u8BD5\uFF01');location.href='http://cd.letfind.com';

直接用 .decode('unicode-escape') 转换成中文

python3:

from urllib import parse
url = quote(url, safe=string.printable)
url = quote(url, safe='/:?=')

url 链接中包含中文的,只对中文进行url编码:

list_url = urllib.quote(list_url.encode('gb2312'), safe=string.printable)

对post数据编码:
post_data = urllib.urlencode(values)

接受参数形式为:[(key1, value1), (key2, value2),...] 和 {'key1': 'value1', 'key2': 'value2',...}

python3

from urllib import parse
data = parse.urlencode(data).encode('utf-8')

判断字符编码类型:
import chardet
print chardet.detect('吾问无为谓我我我我')

{'confidence': 0.99, 'encoding': 'utf-8'}


#coding=utf8
# python2
import HTMLParser parser = HTMLParser.HTMLParser()
s1 = parser.unescape('测试')
print s1
# output: 测试
s2 = parser.unescape('测试')
print s2
# output: 测试
# python3 转换
import html
s1 = "图片中可能有:2 位用户"
print(html.unescape(s1))
# output: 图片中可能有2位用户 或者替换 &#x 为 \u

url 的编码方式:
a = '辛集市'
b = u'辛集市'
print urllib.quote(a) # %E8%BE%9B%E9%9B%86%E5%B8%82
print urllib.quote(a.encode('gbk')) # %D0%C1%BC%AF%CA%D0
print urllib.quote(b.encode('gbk')) # %D0%C1%BC%AF%CA%D0
print urllib.quote(b) # 直接编码会报错 KeyError


下载网页通用编码问题:
def get_root(url,send_headers=None):
'''
获取url的root节点
:param url:
:return:
'''
try:
if send_headers is not None:
request = urllib2.Request(url=url, headers=send_headers)
else:
request = urllib2.Request(url=url)
resp = urllib2.urlopen(request,timeout=10)
resp_html = resp.read()
resp_info = resp.info()
if "Content-Encoding" in resp_info:
if "gzip" == resp_info['Content-Encoding']:
resp_html = zlib.decompress(resp_html, 16+zlib.MAX_WBITS)
elif "deflate" == resp_info['Content-Encoding']:
resp_html = zlib.decompress(resp_html, -zlib.MAX_WBITS) resp.close()
code = chardet.detect(resp_html)['encoding'] # 获取编码方式1
if code is None:
code = resp_info.getparam('charset') # 获取编码方式2 html = resp_html.decode(code, 'ignore')
root = htmlparser.fromstring(html)
return root
except Exception, e:
print 'get_root error:', url, e

View Cod

python 编码问题的更多相关文章

  1. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  2. Python 编码简单说

    先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...

  3. Python之路3【知识点】白话Python编码和文件操作

    Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...

  4. python编码规范

    python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...

  5. 【转】python编码的问题

    摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...

  6. 【转】python编码规范

    http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...

  7. python 编码 UnicodeDecodeError

    将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...

  8. Python编码/文件读取/多线程

    Python编码/文件读取/多线程 个人笔记~~记录才有成长   编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...

  9. 关于Python编码,超诡异的,我也是醉了

    Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图.   我早些时候的其他脚本,csv都是 ...

  10. 规范的python编码

    规范的 python 编码令人赏心悦目,令代码的表达逻辑更清晰,使得工程代码更容易被维护和交流: 编码规范包括对于代码书写格式的约束,不良语法的禁用和推荐的编码手法,下面做些简要的描述: 1. 代码规 ...

随机推荐

  1. git用法之常用命令[克隆、提交]

    1.克隆/下载项目 1)git clone git@git.soydai.cn:liuxuewen/static-file-3.0.git 或者 2)git clone http://git.soyd ...

  2. flexbox学习

    https://philipwalton.github.io/solved-by-flexbox/ http://www.ruanyifeng.com/blog/2015/07/flex-gramma ...

  3. CF576E

    *在#里发他一直WA这道CF题,然后我就去看了看,感觉还挺有趣的,那我就在这里整理一下我的思路..毕竟一边听歌.. 题意: 给个图,每条边初始无色,每次给一个询问(e,c)表示把e涂成颜色c,如果此时 ...

  4. Python之Web框架Django

    Python之Web框架: Django 一. Django Django是一个卓越的新一代Web框架 Django的处理流程 1. 下载地址  Python 下载地址:https://www.pyt ...

  5. Splinter学习——不仅仅是自动化测试哦

    前两天,想抢购一个小米MIX,结果,一开始抢就没有了.于是想,作为程序猿,总得有点特殊手段吧,比如说一个小脚本.最近在学习python,百度了一下,发现了Splinter这个强大的东东!用了不到两小时 ...

  6. libc++abi.dylib`__cxa_throw: 视频播放时异常

    这两天研究视频播放,集成RTMP视频出现的异常,刚好看到一篇博客,楼主使用[AVAudioPlayer Play]时出现了异常...记录下来: 由于xcode中设置了当所有异常出现时的断点,,解决办法 ...

  7. 51nod1183(Edit Distance)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 题意:中文题啦- 思路:dp 用dp[i][j]表示从 ...

  8. QuartZ2D __ 简单用法 1

    一. 简单做一个画板 1. 建立一个UIView类 2. 在.m里建立一个延展 3. 分别定义一个起点, 一个终点的结构体属性 . 在建立一个存储路径的数组 @interface DrawView ( ...

  9. java.sql.SQLException: ORA-01000: 超出打开游标的最大数

    实际上,这个错误的原因,主要还是代码问题引起的.  ora-01000: maximum open cursors exceeded.  表示已经达到一个进程打开的最大游标数.  这样的错误很容易出现 ...

  10. iOS打包测试

    iOS开发中,怎么打包为ipa格式的软件包以及怎么安装到手机终端上. (我的开发环境为Xcode6.1.1 )作为个人开发者(当然我的开发者帐号为个人开发者帐号,而不是企业开发者帐号),对于自己来说, ...