爬虫之网页乱码解决方法(gb2312 -> utf-8)

前言

  今天在测试爬虫项目时,发现了一个很严肃的问题,当爬取的网页编码格式为gb2312时,按照一般的办法转化为utf-8编码时总是乱码,PS:爬取的所有网页无论何种编码格式,都转化为utf-8格式进行存储。

一、问题出现

  使用这篇文章里面的方法可以直接爬取页面信息并保存至本地使用Httpclient实现网页的爬取并保存至本地,当爬取这个网页时http://stock.10jqka.com.cn/zhuanti/hlw_list/,发现使用之前(未知编码 -> utf-8编码)的转化方式总是乱码。于是乎查阅了不少资料,发现都不是太适用。最后自己摸索出了一个解决办法,也特此记录。

二、解决方案

  1. 将gb2312格式转化为gbk格式

  2. 将gbk格式转化为utf-8格式

  这里的转化需要使用gbk作为一个中间格式,作为转化桥梁。

三、具体思路

  1. 当打开http://stock.10jqka.com.cn/zhuanti/hlw_list/这个链接,我们查看源码会发现编码格式为gb2312,如下图所示

  

  2. 由于本项目之前就已经使用了转化方案,但是此转化方案对网页为gb2312格式无效,本项目之前的转化方案的核心源代码为: 

public void getContent(String url) {
        this.get = new HttpGet(url);
        HttpResponse response = client.execute(this.get);
        HttpEntity entity = response.getEntity();
        byte[] bytes = EntityUtils.toByteArray(entity);
        String content = new String(bytes);
        // 默认为utf-8编码
        String charset = "utf-8";
        // 匹配<head></head>之间,出现在<meta>标签中的字符编码
        Pattern pattern = Pattern.compile("<head>([\\s\\S]*?)<meta([\\s\\S]*?)charset\\s*=(\")?(.*?)\"");
        Matcher matcher = pattern.matcher(content.toLowerCase());
        if (matcher.find()) {
            charset = matcher.group(4);
        }
        // 将目标字符编码转化为utf-8编码
        String temp = new String(bytes, charset);
        byte[] contentData = temp.getBytes("utf-8");
        return contentData;
    }

  这种方案对gb2312转化后还是乱码,之后的解决方案核心源代码为:  

public void getContent(String url) {
        this.get = new HttpGet(url);
        HttpResponse response = client.execute(this.get);
        HttpEntity entity = response.getEntity();
        byte[] bytes = EntityUtils.toByteArray(entity);
        String content = new String(bytes);
        // 默认为utf-8编码
        String charset = "utf-8";
        // 匹配<head></head>之间,出现在<meta>标签中的字符编码
        Pattern pattern = Pattern.compile("<head>([\\s\\S]*?)<meta([\\s\\S]*?)charset\\s*=(\")?(.*?)\"");
        Matcher matcher = pattern.matcher(content.toLowerCase());
        if (matcher.find()) {
            charset = matcher.group(4);
            if (charset.equals("gb2312")) {
                byte[] gbkBytes = new String(bytes, "gbk").getBytes();
                return new String(gbkBytes, "utf-8").getBytes();
            }
        }
        // 将目标字符编码转化为utf-8编码
        String temp = new String(bytes, charset);
        byte[] contentData = temp.getBytes("utf-8");
        return contentData;
    }

  通过这种方式我们就可以解决gb2312编码转化为utf-8编码时出现的乱码问题。

四、总结

  多思考,多动脑,这里只是给出了一个工程解决方案,并没有深入到其中的原理,由此问题可以引申出很多有意思的问题,如,utf-8、gbk、gb2312的编码方式怎样的?为什么这样转化就可以解决问题?这些问题值得我们去深入研究。由于本篇文章主要是讲工程解决方案,感兴趣的读者可以去深入了解。谢谢各位园友观看~

  附送一篇关于爬虫乱码问题解决的很好的文章,网络爬虫的乱码处理 ,讲得很不错,有做爬虫的园友遇到这一部分的问题时可以好好参考参考。

时间: 2024-10-19 10:38:57

爬虫之网页乱码解决方法(gb2312 -> utf-8)的相关文章

html乱码原因与网页乱码解决方法

造成html网页乱码原因主要是html源代码内中文字内容与html编码不同造成.但无论是哪种情况造成乱码在网页开始时候都需要设置网页编码. charset编码设置 html网页乱码效果截图 一.乱码造成原因   -   TOP 1.比如网页源代码是gbk的编码,而内容中的中文字是utf-8编码的,这样浏览器打开即会出现html乱码.反之网页是编码utf-8,内容是gbk也会出现乱码. 2.html网页编码是gbk,而程序从数据库中调出呈现是utf-8编码的内容也会造成编码乱码. 3.浏览器不能自

Ubuntu几种常见乱码解决方法

一.网页中的flash乱码:        ubuntu默认浏览器是Firefox,但是Ubuntu默认不安装像flash这种带版权的软件,所以当你浏览像youku或网页播放器时,这种带有 flash的网页,firefox会提示你安装缺失插件,选择安装Flash插件后确实是可以显示flash了,不过你会发现,在flash上面的中文都是方框!注意:建议选择adobe的插件,这是由于兼容性.    解决方法:    终端中输入:    cd /etc/fonts/conf.d/    sudo cp

asp.net url址址中中文汉字参数传递乱码解决方法

中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirect("B.asp教程x?Name="+Server.UrlEncode(Name)); 接参的时候用UrlDecode: Response.Write(Server.UrlDecode(Request.QueryString["Name"])); 脚本儿里传参的时候用e

java中文乱码解决方法汇总

publicstaticvoidmain(String[]argv){ try{ System.out.println("中文");//1 System.out.println("中文".getBytes());//2 System.out.println("中文".getBytes("GB2312″));//3 System.out.println("中文".getBytes("ISO8859_1″));

jsp页面保存到数据库有乱码解决方法

第一种: 在页面前加上 <%@ page language="java" contentType="text/html;charset=gbk" errorPage=""%> <%request.setCharacterEncoding("GBK");%> 第一行说明你的页面用的是中文编码 第二行声明你的页面传值也用中文编码 第二种 tomcat4.x支持中文传码,但5.x不支持,如果用5.0以上的版本

Zxing中文乱码解决方法

Zxing中文乱码解决方法总结 尝试过很多方法  最后发现此方法解决的乱码最多....... 在百度搜索二维码图片 经过前2页的测试  除开一张图之外  其余都能扫描出结果 如果大家有更好的解决方法 请联系我 谢谢 解决方法如下: 首先使用反射的方法判断扫描结果 是不是ISO8859-1的编码格式 如果是    ISO8859-1  编码格式就将扫描结果转换成GB2312 如果不是ISO8859-1 编码就直接显示......希望大家补充 我写了一个工具类 /** * 中文乱码 * * 暂时解决

VIM显示utf-8文档乱码解决方法

1.相关基础知识介绍 在Vim中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding和termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱码.因此,每一个Vim用户都应该明确这四个选项的含义.下面,我们详细介绍一下这四个选项的含义和作用. (1)encoding encoding是Vim内部使用的字符编码方式.当我们设置了encoding之后,Vim内部所有的buffer.寄存器.脚本中的字符串等,全都使用这个编码.Vi

gvim的菜单乱码解决方法

gvim的菜单乱码解决方法: (乱码是由于系统内码不兼容导致,系统内码包括gb2312 gb18030 utf-8 utf-16[unicode]等) 生成文件 ~/.gvimrc 并添加如下语句:set encoding=chineseset langmenu=zh_CN.GBKset imcmdlineset guifont="Serif 14"source $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vim 保存后即可解决乱码问题

url传值到Action的乱码解决方法

jsp页面 URL传中文参数到Action里面出现乱码,用过滤器和控制器都解决不了,用了我两个多小时解决这个小问题!解决方法有以下几种:第一种:在Action中用 new String(str.getBytes("ISO8859_1"), "UTF8"),进行转码,因为传递的时候,中文默人的是ISO8859_1第二种:可通过配置TOMCAT来解决此问题,具体解决方法如下:在tomcat的server.xml里,找到<Connector port="8