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

爬取网页的时候,如果网页编码又有utf-8还有gbk,这种情况有解吗?

  •  
  •   sivacohan ·
    SIvaCoHan · 2013-05-28 09:09:43 +08:00 · 3991 次点击
    这是一个创建于 4180 天前的主题,其中的信息可能已经有所发展或是发生改变。
    给大学的网站写个爬虫。爬各个学院和教务处的通知。
    各个学院的网站太奇葩了。
    编码声明charset = utf-8
    实际上使用gbk。

    遇到一个页面存在两种编码的情况,我就要压制想打人的冲动。
    9 条回复    1970-01-01 08:00:00 +08:00
    phuslu
        1
    phuslu  
       2013-05-28 09:12:58 +08:00
    chardet
    fishsjoy
        2
    fishsjoy  
       2013-05-28 09:24:56 +08:00
    非互联网公司的网页很多这样,chardet探测吧
    alsotang
        3
    alsotang  
       2013-05-28 12:57:50 +08:00
    xingzhi
        4
    xingzhi  
       2013-05-28 13:21:06 +08:00
    这是我以前写过的一段话,若有错误请指正:

    对于网页编码的处理,一般是按以下几个顺序的:
    1. 在http response headers, content-type中的charset属性值
    2. 网页源码中, header里meta标签中, content属性中指定的charset值
    3. xml文件中的encoding
    4. 自动检测

    可是,以上的情况,对于不遵循标准的网站来说,就会成问题了,例如:
    response headers没有提供charset
    response headers中的charset值与网页源码中的charset值不一样

    如何解决?

    我想的就是,浏览器怎么做,我就怎么做。
    查了下资料,对于浏览器而言, 它也是按上述顺序来进行编码检测的, 并且:
    当response headers没有提供charset时, 检测meta中的charset,
    当两者不一样时,使用的是response headers中的charset。
    xingzhi
        5
    xingzhi  
       2013-05-28 13:22:12 +08:00
    补充: 之所以不直接使用chardet, 是因为它的处理速度比较慢。
    可以在charset判断不出编码的情况下,再来使用chardet。
    013231
        6
    013231  
       2013-05-28 13:32:51 +08:00
    可以利用頻率統計和狀態機推測真編碼:
    http://mxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/base/
    luikore
        7
    luikore  
       2013-05-28 13:50:26 +08:00
    这种网页也没什么爬的价值...
    lookhi
        8
    lookhi  
       2013-05-28 13:56:48 +08:00
    国内的你可以直接尝试UTF8 不行就直接GBK或GB18030
    如果还不行,就放弃。这种不标准的一般都在这2个内.
    xuan_lengyue
        9
    xuan_lengyue  
       2013-05-28 14:42:36 +08:00
    如果只是 GBK 和 UTF8 之间纠结的话可以检测的,UTF8 具有比较明显的特征,所以只要这段数据不是 UTF8 编码就是 GBK 了。

    我目前用的一段代码见
    https://gist.github.com/fireblue/5660870

    基本上是 C 的,供楼主参考。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5647 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:30 · PVG 15:30 · LAX 23:30 · JFK 02:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.