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根据文件大小打log日志
Oct 09 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
用python编写第一个IDA插件的实例
May 29 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
jupyter notebook实现显示行号
Apr 13 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
用python计算文件的MD5值
Dec 23 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 api函数实现数组的交换排序示例
2014/04/13 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Python WEB应用部署的实现方法
2019/01/02 Python
python如何实现数据的线性拟合
2019/07/19 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
毕业生个人求职信范例分享
2013/12/17 职场文书
医院门卫岗位职责
2013/12/30 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
离婚协议书格式
2014/11/21 职场文书
违纪检讨书范文
2015/01/27 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
Go使用协程交替打印字符
2021/04/29 Golang