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 相关文章推荐
python实现类似ftp传输文件的网络程序示例
Apr 08 Python
python多进程操作实例
Nov 21 Python
python在Windows8下获取本机ip地址的方法
Mar 14 Python
粗略分析Python中的内存泄漏
Apr 23 Python
Python解析最简单的验证码
Jan 07 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
python实现中文文本分句的例子
Jul 15 Python
Python八皇后问题解答过程详解
Jul 29 Python
Python中的self用法详解
Aug 06 Python
python实现从wind导入数据
Dec 03 Python
用 Python 制作地球仪的方法
Apr 24 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
PHP新手上路(十四)
2006/10/09 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
js 函数调用模式小结
2011/12/26 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
Python中的模块和包概念介绍
2015/04/13 Python
python返回昨天日期的方法
2015/05/13 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Python异常处理机制结构实例解析
2020/07/23 Python
业务代表的岗位职责
2013/11/16 职场文书
好邻里事迹材料
2014/01/16 职场文书
材料会计岗位职责
2014/03/06 职场文书
学习之星事迹材料
2014/05/17 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技