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
liuxurong
V2EX  ›  Python

想学网页抓取,新手Python的编码问题

  •  
  •   liuxurong · 2012-06-20 09:35:52 +08:00 · 30634 次点击
    这是一个创建于 4546 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #-*-coding:utf-8-*-
    #-*-encoding=utf-8
    import cookielib, urllib2,urllib,sys
    from bs4 import BeautifulSoup
    response = urllib2.urlopen('http://www.baidu.com')
    html = response.read()
    soup = BeautifulSoup(html)


    a=soup.prettify()

    print a



    UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 3621: illegal multibyte sequence

    搞不懂编码问题,请问怎么办.
    23 条回复    2016-09-23 07:04:37 +08:00
    westy
        1
    westy  
       2012-06-20 09:39:04 +08:00   ❤️ 1
    百度的页面是GB2312编码的貌似。
    yujnln
        2
    yujnln  
       2012-06-20 09:44:20 +08:00   ❤️ 1
    那就现学现用吧 /t/35062
    hiwljun
        3
    hiwljun  
       2012-06-20 09:50:15 +08:00   ❤️ 1
    试试用:
    response = urllib2.urlopen('http://www.baidu.com').encode('gb2312')
    liuxurong
        4
    liuxurong  
    OP
       2012-06-20 09:58:31 +08:00
    @hiwljun 不行哟。
    @yujnln 那个贴我看过了,搞了一个晚上,同呕吐,看来基础太差
    yangg
        5
    yangg  
       2012-06-20 10:04:21 +08:00   ❤️ 1
    html = response.read().decode('gb2312');
    hiwljun
        6
    hiwljun  
       2012-06-20 10:06:43 +08:00
    @yangg 哦,对,是.decode()
    yangg
        7
    yangg  
       2012-06-20 10:07:49 +08:00   ❤️ 1
    @hiwljun 还有read()之后 才decode啊
    liuxurong
        8
    liuxurong  
    OP
       2012-06-20 10:09:37 +08:00
    @yangg 还是不行...俺用windows..是这个原因吗?
    alai
        9
    alai  
       2012-06-20 10:39:15 +08:00   ❤️ 1
    2009-04-15

    关于抓取中文页面的一点小总结 - [python]
    说起来简单,但也是经过好几个项目,来来回回出问题得出来的。

    +最终转成UTF8输出是毋庸置疑的。
    +抓的如果是中文页面的话,用GB18030来decode是比较正统的方法,gb2312是一个误区,其实我们的页面中使用的字符编码已经早就超出2312的那些了。
    +明明是中文页面抓回来却没法用18030来decode的话,一般是因为页面中混杂了非法字符的原因,可以用ignore忽略掉非法字符。
    alafeizai
        10
    alafeizai  
       2012-06-20 10:41:16 +08:00   ❤️ 1
    ignore正解
    liuxurong
        11
    liuxurong  
    OP
       2012-06-20 10:47:27 +08:00
    UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position 26408: illegal multibyte sequence
    c
        12
    c  
       2012-06-20 10:59:16 +08:00   ❤️ 1
    这年代了还用urllib2呀。 用requests吧,结果自动解码成unicode

    >>> import requests
    >>> r = requests.get('http://www.baidu.com')
    >>> r.text
    ....
    >>> type(r.text)
    <type 'unicode'>
    c
        13
    c  
       2012-06-20 11:01:30 +08:00   ❤️ 1
    BF也过时了,用pyquery吧。

    >>> from pyquery import PyQuery as pq
    >>> html = pq(r.text)
    >>> print html('title').text()
    百度一下,你就知道
    chairo
        14
    chairo  
       2012-06-20 11:29:07 +08:00   ❤️ 1
    @c 直接libxml不就行了,为啥非套一层pyquery
    tuoxie007
        15
    tuoxie007  
       2012-06-20 11:55:49 +08:00   ❤️ 1
    @c
    @chairo 你们都很高级,我和LZ用的是同样的东西,哎,才发现自己这么土

    @c 嗯,你们名字很高级

    然后LZ那个应该改成这样,前面几楼说的都不能执行的,你们最起码自己试了再贴出来嘛=.=
    html = response.read()
    uhtml = unicode(html, "gbk")
    soup = BeautifulSoup(uhtml)

    另外,为什么我抓baidu的话,不需要自己转,soup自己就可以完成了,你是用的win?还是soup版本太低?
    clowwindy
        16
    clowwindy  
       2012-06-20 12:14:00 +08:00   ❤️ 1
    因为是 encode error,所以楼主是 print 的时候挂掉的,并且楼主一定在用简体中文 windows
    解决方法就是改用 Cygwin,远离傻逼 windows 终端
    ling0322
        17
    ling0322  
       2012-06-20 12:29:01 +08:00   ❤️ 1
    @chairo 貌似是有些网页不是标准xml格式的libxml不能解析, 但是pyquery容错性很强
    INT21H
        18
    INT21H  
       2012-06-20 12:33:02 +08:00   ❤️ 1
    慢慢的就会发现BS的效率太低了,最后走上了re的不归路 =。=
    ling0322
        19
    ling0322  
       2012-06-20 12:44:22 +08:00   ❤️ 1
    这个和控制台的编码(默认是GBK)有关吧, 在IDLE中运行没有问题
    yangg
        20
    yangg  
       2012-06-20 14:18:11 +08:00   ❤️ 1
    @INT21H 一直用re的路过,各种方便
    liuxurong
        21
    liuxurong  
    OP
       2012-06-21 00:33:26 +08:00
    @c 谢谢。你介绍的都很好用。
    lddhbu
        22
    lddhbu  
       2013-04-19 19:28:43 +08:00
    解决了我的问题
    feilong
        23
    feilong  
       2016-09-23 07:04:37 +08:00
    @clowwindy 感谢,终于明白了是终端的问题,换一个果然没问题了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2840 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:26 · PVG 15:26 · LAX 23:26 · JFK 02:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.