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学习之编写查询ip程序
Feb 27 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
python模拟事件触发机制详解
Jan 19 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
python获取代理IP的实例分享
May 07 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python操作json的方法实例分析
Dec 06 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
快速排序的四种python实现(推荐)
Apr 03 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 Python
python怎么判断模块安装完成
Jun 19 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
Python中格式化format()方法详解
2017/04/01 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python构建网页爬虫原理分析
2017/12/19 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
python3.7.0的安装步骤
2018/08/27 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
详解Python locals()的陷阱
2019/03/26 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
详解Python中第三方库Faker
2020/09/25 Python
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
厨师长岗位职责范本
2014/08/25 职场文书
六查六看自查报告
2014/10/14 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python