python抓取并保存html页面时乱码问题的解决方法


Posted in Python onJuly 01, 2016

本文实例讲述了python抓取并保存html页面时乱码问题的解决方法。分享给大家供大家参考,具体如下:

在用Python抓取html页面并保存的时候,经常出现抓取下来的网页内容是乱码的问题。出现该问题的原因一方面是自己的代码中编码设置有问题,另一方面是在编码设置正确的情况下,网页的实际编码和标示的编码不符合造成的。html页面标示的编码在这里:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这里提供一种简单的办法解决:使用chardet判断网页的真实编码,同时从url请求返回的info判断标示编码。如果两种编码不同,则使用bs模块扩展为GB18030编码;如果相同则直接写入文件(这里设置系统默认编码为utf-8)。

import urllib2
import sys
import bs4
import chardet
reload(sys)
sys.setdefaultencoding('utf-8')
def download(url):
  htmlfile = open('test.html','w')
  try:
    result = urllib2.urlopen(url)
    content = result.read()
    info = result.info()
    result.close()
  except Exception,e:
    print 'download error!!!'
    print e
  else:
    if content != None:
      charset1 = (chardet.detect(content))['encoding'] #real encoding type
      charset2 = info.getparam('charset') #declared encoding type
      print charset1,' ', charset2
      # case1: charset is not None.
      if charset1 != None and charset2 != None and charset1.lower() != charset2.lower():
        newcont = bs4.BeautifulSoup(content, from_encoding='GB18030')  #coding: GB18030
        for cont in newcont:
          htmlfile.write('%s\n'%cont)
      # case2: either charset is None, or charset is the same.
      else:
        #print sys.getdefaultencoding()
        htmlfile.write(content) #default coding: utf-8
  htmlfile.close()
if __name__ == "__main__":
  url = 'https://3water.com'
  download(url)

得到的test.html文件打开如下,可以看到使用的是UTF-8无BOM编码格式存储的,也就是我们设置的默认编码:

python抓取并保存html页面时乱码问题的解决方法

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
python使用pycharm环境调用opencv库
Feb 11 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
如何通过Django使用本地css/js文件
Jan 20 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
Python实现井字棋小游戏
Mar 09 Python
一些关于python 装饰器的个人理解
Aug 31 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
Python实现生成bmp图像的方法
Jun 13 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 Python
python处理html转义字符的方法详解
Jul 01 #Python
python简单读取大文件的方法
Jul 01 #Python
python编码总结(编码类型、格式、转码)
Jul 01 #Python
Python编码类型转换方法详解
Jul 01 #Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 #Python
Python中的time模块与datetime模块用法总结
Jun 30 #Python
详解Swift中属性的声明与作用
Jun 30 #Python
You might like
世界收音机发展史
2021/03/01 无线电
用PHP读取超大文件的实例代码
2012/04/01 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
大学活动邀请函
2014/01/28 职场文书
创业计划书如何编写
2014/02/06 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
MySQL数字类型自增的坑
2021/05/07 MySQL
canvas绘制折线路径动画实现
2021/05/12 Javascript
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python
Spring实现内置监听器
2021/07/09 Java/Android