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 时间操作例子和时间格式化参数小结
Apr 24 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python中文编码与json中文输出问题详解
Aug 24 Python
启动Atom并运行python文件的步骤
Nov 09 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
wxPython实现列表增删改查功能
Nov 19 Python
python异常处理和日志处理方式
Dec 24 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
详解Python requests模块
Jun 21 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
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
js判断节假日实例代码
2017/12/27 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Python验证码截取识别代码实例
2020/05/16 Python
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
生产车间实习自我鉴定
2013/09/23 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
八项规定整改方案
2014/02/21 职场文书
职业生涯规划书前言
2014/04/15 职场文书
校长四风对照检查材料
2014/09/27 职场文书
付款委托书范本
2014/10/05 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
好人好事新闻稿
2015/07/17 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
成人成长感言如何写?
2019/08/16 职场文书
导游词之镜泊湖
2019/12/09 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技