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 · 7737 次点击
    这是一个创建于 3912 天前的主题,其中的信息可能已经有所发展或是发生改变。
    简化一下程序,要打开类似这样的网页:

    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   ·   我们的愿景   ·   实用小工具   ·   2264 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 109ms · UTC 06:24 · PVG 14:24 · LAX 23:24 · JFK 02:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.