Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 603|回复: 0

python BeautifulSoup解决中文乱码问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-12 11:59:50 | 显示全部楼层 |阅读模式

    刚开始用BeautifulSoup抓取网页,遇到中文乱码问题,在网上搜了一些方法,先记录于此, 看看哪种方法好用

     

    1、http://leeon.me/a/beautifulsoup-chinese-page-resolve

    import urllib2
    from BeautifulSoup import BeautifulSoup
    
    page = urllib2.urlopen('http://www.leeon.me');
    soup = BeautifulSoup(page,fromEncoding="gb18030")
    
    print soup.originalEncoding
    print soup.prettify()

    如果中文页面编码是gb2312,gbk,在BeautifulSoup构造器中传入fromEncoding="gb18030"参数即可解决乱码问题,即使分析的页面是utf8的页面使用gb18030也不会出现乱码问题!

     经测试,该方法可行,但是在python3和BeautifulSoup4.1下要写成   from_encoding="gb18030"

    2、http://hi.baidu.com/mengjingchao11/item/604b75e5a426fa2e6cabb856

    首先我们要引入urllib2包,使用urllib2中的 urlopen打开指定 的网页。 

    page=urllib2.urlopen(网页url)

    charset=page.headers['Content-Type'].split(' Charset=')[1].lower()来找到网页的编码格式。

    使用BeautifulSoup(page.read(),fromEncoding=charset)使用charset指定的编码格式来读取网页内容。

    2、http://hi.baidu.com/dskjfksfj/item/bc658fd1646fef362b35c79b

    这两天用python爬取当当网页上面的商品信息,对网页进行解析使用的是beautifulsoup,但是解析的过程中,得到的网页上面的文本信息有些显示出来是正常的,有些则为乱码。

    网上找了好久,期间对python的编码方式,以及字符串的各种编码方式之间的转换算是有了初步了解,可惜,试了他们提出来的很多方法,都没有解决问题。最后,仔细琢磨了下文本之间编码转换的原理,用这种方法解决了:

    由于当当网页的编码方式是简体中文gb2312 (查看网页源码,可以看到<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />),而python内部的编码方式为unicode,之前的代码是这样的:

    contentAll = urllib.urlopen(urlLink).read()
    soup = BeautifulSoup.BeautifulSoup(contentAll)  #生成BeautifulSoup对象

    经过url定位得到html的document对象之后,此时的编码方式为网页文本的编码方式gb2312,此时送进去BeautifulSoup生成一个BeautifulSoup对象则python以为contentAll为unicode编码,即系统已经以为contentAll为unicode编码了,这将引起后续显示为乱码的问题,因为在网页上面看网页的时候如果改变网页字符编码的时候就会看到乱码。

    因此在将contentAll送进去生成BeautifulSoup对象之前必须对其进行解码(decode)为unicode,使用的code为gb2312,修改后的代码如下所示:

    contentAll = urllib.urlopen(urlLink).read()
    soup = BeautifulSoup.BeautifulSoup(contentAll.decode('gb2312','ignore'))  #生成BeautifulSoup对象

    解码的时候加上ignore参数是因为解码过程中有一部分貌似不能正常解码,加上该参数之后能跳过该部分。

    后续还需要将得到的信息写进本地文本,由于得到的对象都是unicode编码的,只有将其进行gb2312编码(encode)才能看到有意义的内容,因此在写文件的函数里面将其使用gb2312进行编码再写进文本文件里面去。如下所示:

    def writeFile(data, filepath):
        outfile = open(filepath,'ab')
        data = data.encode('gb2312','ignore')
        outfile.write(data)
        outfile.close()

    4、http://www.coder4.com/archives/3621

    实际上,fromEncoding=”gb18030″并不是一劳永逸的方法,当面对iso-8859-1编码的中文网页时,还是会出现乱码。

    BS会乱码的根源是:其内部猜测编码的机制并不完善。

    因此,最根本的解决方法是,使用编码自动检测工具,获得网页真实编码,例如chardet这个模块。然后将获取到的encoding设置到BS的fromEncoding构造参数中!!!

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 07:17 , Processed in 0.053414 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表