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的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
Python中max函数用法实例分析
Jul 17 Python
python结合API实现即时天气信息
Jan 19 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
用python找出那些被“标记”的照片
Apr 20 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
python统计多维数组的行数和列数实例
Jun 23 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
Python安装Flask环境及简单应用示例
May 03 Python
Python数据类型之String字符串实例详解
May 08 Python
如何在Python中实现goto语句的方法
May 18 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调用三种数据库的方法(1)
2006/10/09 PHP
一个PHP数组应该有多大的分析
2009/07/30 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
js在IE与firefox的差异集锦
2014/11/11 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
python内置数据类型之列表操作
2018/11/12 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
小学开学寄语
2014/01/19 职场文书
新教师培训心得体会
2014/09/02 职场文书
学校师德师风整改措施
2014/10/27 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server