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实现apahce网站日志分析示例
Apr 02 Python
详解Python中break语句的用法
May 14 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
python re模块的高级用法详解
Jun 06 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
python字典的setdefault的巧妙用法
Aug 07 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
基于python实现地址和经纬度转换
May 19 Python
基于python实现删除指定文件类型
Jul 21 Python
python学习笔记之多进程
Aug 06 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 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静态文件生成类实例分析
2015/01/03 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python用threading实现多线程详解
2017/02/03 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
python实现彩色图转换成灰度图
2019/01/15 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
MYSQL支持事务吗
2013/08/09 面试题
档案接收函范文
2014/01/10 职场文书
汇源肾宝广告词
2014/03/20 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
入团介绍人意见范文
2015/06/04 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL