求救,Python2.7编码问题,痛不欲生了!! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zippera
V2EX    Python

求救,Python2.7编码问题,痛不欲生了!!

  •  
  •   zippera
    zippera 2013-08-15 20:38:20 +08:00 8393 次点击
    这是一个创建于 4443 天前的主题,其中的信息可能已经有所发展或是发生改变。
    简化一下程序,要打开类似这样的网页:

    import urllib2

    url = 'http://mlook.mobi/book/info/6248'
    res = urllib2.urlopen(url)
    print res.read()

    乱码!!!

    PS: win下Cygwin


    请不要说BS、pyquery、lxml、Python3。。。请帮帮我解决这个问题,并解释,多谢了!
    第 1 条附言    2013-08-15 23:08:48 +08:00
    修正一下:

    用的是 win下的 git bash。 (不是cygwin,犯傻了)

    顺便请教大家在win下怎么使用,用什么终端,做些什么设置。

    顺便求一个系统学习python2.7编码问题的教程。
    28 条回复    1970-01-01 08:00:00 +08:00
    felix021
        1
    felix021  
       2013-08-15 20:44:53 +08:00   3
    print res.read().decode('utf-8').encode('cp936')
    itfanr
        2
    itfanr  
       2013-08-15 21:12:04 +08:00
    @felix021 无输出。。。
    timonwong
        3
    timonwong  
       2013-08-15 21:19:49 +08:00
    @itfanr
    无输出,两种可能
    1. read() 不能读两次
    2. 这个网页包含了一些稀有字符,因此要 print res.read().decode('utf-8').encode('gb18030')
    ling0322
        4
    ling0322  
       2013-08-15 21:22:27 +08:00
    1. 去看看print res.read().decode('gbk')
    2. 这个response网页是不是被gzip压缩过
    cute
        5
    cute  
       2013-08-15 21:25:02 +08:00
    import sys
    import urllib2
    url = 'http://mlook.mobi/book/info/6248'
    res = urllib2.urlopen(url)
    s = res.read()
    print s.decode('utf8').encode(sys.stdout.encoding)
    ccdjh
        6
    ccdjh  
       2013-08-15 21:33:45 +08:00
    这个么?

    import sys
    default_encoding = 'utf-8'
    if sys.getdefaultencoding() != default_encoding:
    reload(sys)
    sys.setdefaultencoding(default_encoding)
    itfanr
        7
    itfanr  
       2013-08-15 21:49:37 +08:00
    @timonwong 哦 还不能read两次啊
    zippera
        8
    zippera  
    OP
       2013-08-15 21:52:25 +08:00
    @felix021 500错误。。
    zippera
        9
    zippera  
    OP
       2013-08-15 21:58:45 +08:00
    @ling0322 应该跟压缩无关吧,不处理的话中文乱码,英文是正常的。
    @ccdjh 这个试过了,不行。。

    其余的没法试了,python执行后卡那儿不动了。。
    cj1324
        10
    cj1324  
       2013-08-15 22:16:57 +08:00
    你们都没有试用编码识别工具的习惯吗?
    manoon
        11
    manoon  
       2013-08-15 22:26:18 +08:00
    先wget掉。
    然后在本地读取HTML来测试。
    nulloo
        12
    nulloo  
       2013-08-15 22:28:31 +08:00
    cygwin没怎么用过,反正我尽量不用win的终端输出中文,宁可用ide或者ssh,重定向py的输出到文件,用编辑器看看编码对不,再就是检查环境变量
    zippera
        13
    zippera  
    OP
       2013-08-15 22:35:15 +08:00
    @manoon 用urllib.urlretrieve下载到本地后,读取完全正常。
    @cj1324 哦?说说?
    @nulloo 打嘴,我说错了,是git bash。网页是中文,没办法啊。文件里面是正常的,可能是这个终端的问题
    manoon
        14
    manoon  
       2013-08-15 22:44:06 +08:00
    @zippera 为什么要urlretrieve呢?(我只知道抓图片用这个。。)
    我的意思是,你直接用

    url = 'http://mlook.mobi/book/info/6248'
    res = urllib2.urlopen(url)
    con=res.read()
    fhtml=open("con.html","w+")
    print >>fhtml,s
    试试看。
    mengzhuo
        15
    mengzhuo  
       2013-08-15 22:53:28 +08:00
    python开发必须设置系统级的编码utf8啊

    -------------
    查询次数: 6 次,查询用时:70.36 ms
    这是php?
    pandada8
        16
    pandada8  
       2013-08-15 22:57:19 +08:00 via Android
    先在本地看看编码,decode时候可以加个 error=“ignore"(直觉告诉我似乎我有拼写错误……参阅官方文档)
    VYSE
        17
    VYSE  
       2013-08-15 23:03:56 +08:00
    export LANG=en_US.UTF-8

    中文系统上cmd里这样写肯定不是乱码:
    print res.read().decode('utf-8')

    那就是CYGWIN输出编码的问题,不信你可以cat一个utf-8的html文件
    zippera
        18
    zippera  
    OP
       2013-08-15 23:05:21 +08:00
    @manoon 我又傻了,用的open,写错了,不好意思。open写入后再读取是没有问题的。


    @mengzhuo 用的git bash,怎么设置其默认编码呢,还有win的编码?


    @pandada8 也试过。。
    powerfj
        19
    powerfj  
       2013-08-16 18:42:25 +08:00
    请用linux..
    zippera
        20
    zippera  
    OP
       2013-08-16 18:52:30 +08:00 via Android
    @powerfj 对!Linux下没问题。
    infinte
        21
    infinte  
       2013-08-16 23:32:17 +08:00
    Python2 在控制台输出用的似乎是 WriteConsoleA/WriteConsoleOutputA
    不支持 unicode 的
    所以死了这条心,换 py3 吧
    jinfan1009
        22
    jinfan1009  
       2013-08-17 15:21:29 +08:00
    不是py3就能解决这样的问题哦,其实你这是读取网站的源文件,要看网站本来采用的是什么编码,不过所有的编码都可以解码程unicode,这样就是一致的!
    zippera
        23
    zippera  
    OP
       2013-08-17 15:44:11 +08:00 via Android
    @infinte py3我学过深入学习Python,好是好,但支持不够,还是要熟练2才行啊
    zippera
        24
    zippera  
    OP
       2013-08-17 15:45:58 +08:00 via Android
    @jinfan1009 这个网页本身是utf8的,程序本身也没问题,问题出在了print,出在了终端和系统。用Linux正常。
    infinte
        25
    infinte  
       2013-08-17 18:18:27 +08:00
    @zippera 用重定向呢?
    换 chcp 65001 呢?
    zippera
        26
    zippera  
    OP
       2013-08-17 18:28:43 +08:00 via Android
    @infinte 我电脑直接卡死在那儿,系统可能出了问题
    infinte
        27
    infinte  
       2013-08-17 18:32:14 +08:00
    @zippera 重定向居然会卡死这不科学
    cp65001 python2 似乎不支持

    当然我大 nodejs 没有这类乱七八糟的问题
    zippera
        28
    zippera  
    OP
       2013-08-17 18:37:30 +08:00 via Android
    @infinte 来个nodejs的爬虫程序呗,我观摩观摩
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     952 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:45 PVG 03:45 LAX 12:45 JFK 15:45
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86