爬取51Job和猎聘网的信息,想处理字符集问题(51job为gbk,猎聘为utf-8),

找到两个网站字符集信息都在同一标签下

就想先把网页保存成String,解析一遍获取字符集(因为charset字符是英文,不需要转换字符集),然后将网页中文内容转换成对应的正确的字符集,最后再转换成统一的字符集utf-8

1.0实现,2次调用Entity.Utils.toString方法

CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200) {
//网站转为String
String get_Charset_Entity2String = EntityUtils.toString(httpResponse.getEntity());
//解析
Document get_Charset_Document = Jsoup.parse(get_Charset_Entity2String);
//字符集信息提取,51job和猎聘
String charset = get_Charset_Document.select("meta[http-equiv=Content-Type]")
.attr("content").split("=")[1];
System.out.println(charset);
//根据字符集重新编码成正确的
String Ori_Entity = EntityUtils.toString(httpResponse.getEntity(),charset);
//转换为统一的utf-8
String entity = new String(Ori_Entity.getBytes(),"utf-8");
System.out.println(entity);
        {

报错

参考 https://blog.csdn.net/qq_23145857/article/details/70213277

发现EntityUtils流只存在一次,但是有不想一个网页要连接两次,

这难不倒我,直接转换原来保留的String

2.0实现,第二次不使用EntityUtils

CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200) {
//网站转为String
String get_Charset_Entity2String = EntityUtils.toString(httpResponse.getEntity());
//解析
Document get_Charset_Document = Jsoup.parse(get_Charset_Entity2String);
//字符集信息提取,51job和猎聘
String charset = get_Charset_Document.select("meta[http-equiv=Content-Type]")
.attr("content").split("=")[1];
System.out.println(charset);
//根据字符集重新编码成正确的,不用EntityUtils,直接转get_Charset_Entity2String
String Ori_Entity = new String(get_Charset_Entity2String.getBytes(), charset);
//转换为统一的utf-8
String entity = new String(Ori_Entity.getBytes(),"utf-8");
System.out.println(entity);
        {

输出:

字符集依旧有问题,发现不指定字符集,EntityUtils.toString()就用"ISO-8859-1"字符集,可我就是不知道字符集

看到参考链接下面的解决办法,眼前一亮,把流直接以位数组保存,都能灵活变换

3.0实现,不使用EntityUtils.toString,改用EntityUtils.toByteArray()        

CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200) {
          //网站转换为byte[]
byte[] bytes = EntityUtils.toByteArray(httpResponse.getEntity());
//byte列表转为默认字符集
String get_Charset_Entity2String = new String(bytes);
//解析
Document get_Charset_Document = Jsoup.parse(get_Charset_Entity2String);
//字符集信息提取,51job和猎聘
String charset = get_Charset_Document.select("meta[http-equiv=Content-Type]")
.attr("content").split("=")[1];
System.out.println(charset);
//根据字符集重新编码成正确的
String Ori_Entity = new String(bytes, charset);
//转换为统一的utf-8
String entity = new String(Ori_Entity.getBytes(), "utf-8");
System.out.println(entity);
        }

对于里面的默认字符集

参考:https://blog.csdn.net/wangxin1949/article/details/78974037

  • 1、如果使用了eclipse,由java文件的编码决定
  • 2、如果没有使用eclipse,则有本地电脑语言环境决定,中国的都是默认GBK编码,
只要没有改变英文的编码,就没有影响,只要能从标签里提取出charset字符集就可以转换成正确的
 

输出正常

换成猎聘的url再尝试

完美,爬虫的字符集真神奇

EntityUtils.toString(entity)处理字符集问题解决的更多相关文章

  1. mysqldump之字符集问题解决

    最近导数据的需求真多,年底了大家都要做分析吗?近期使用mysqldump导出的中文出现乱码问题. mysqldump -uroot -ppassword -S /tmp/mysql9991.sock ...

  2. mysql点滴_02程序中运行sql语句报字符集问题解决

    程序中运行  "SELECT t.EVENT_TYPE_ID FROM RATABLE_EVENT_TYPE t WHERE t.NAME='帐期末费用转移事件'"  报错 错误码 ...

  3. HttpClient(4.3.5) - HTTP Entity

    HTTP entity HTTP messages can carry a content entity associated with the request or response. Entiti ...

  4. HttpClient之EntityUtils对象

    最近在学习安卓并用thinkphp做后台,为了抵抗自己的烂记性,就在这里记录一下当我从tp后台获取到json串传到安卓客户端所用到的一个方法函数. EntityUtils对象是org.apache.h ...

  5. 跨域问题解决方式(HttpClient安全跨域 & jsonp跨域)

    1 错误场景 今天要把项目部署到外网的时候,出现了这种问题, 我把两个项目放到自己本机的tomcat下, 进行代码调试, 执行 都没有问题的, 一旦把我须要调用接口的项目B放到其它的server上, ...

  6. HttpClient之EntityUtils工具类

    今天看到tttpclient-tutorial上面有这样一句话-----非常的不推荐使用EntityUtils,除非知道Entity是来自可信任的Http Server 而且还需要知道它的最大长度.文 ...

  7. handler以及AnyscTask处理机制

    1.Handler 主文件:MainActivity.java package com.example.asynctaskdownload; import java.io.IOException; i ...

  8. JavaWeb日常笔记

    1.   XML文档的作用和解析 1. XML的基本概述: XML的主要是用来存储一对多的数据,另外还可以用来当做配置文件存储数据.XML的表头如下: <?xml version='1.0' e ...

  9. 阿里云CDN刷新预热接口

    阿里云OSS映射的文件地址需要即时访问到最新数据,需要即时调用CDN的刷新预热类接口 RefreshObjectCaches 刷新接口. 参考官方接口文档资料:https://help.aliyun. ...

随机推荐

  1. 剑指offer 11:变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   解法:使用数学归纳法可得,跳n级台阶的跳法一共有f(n)=2n-1中,即本 ...

  2. SourceInsight教程

    概述: Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析.Source Insight能分析你的源代码并在你工作的同时动态 ...

  3. WC个人项目

    一.Github项目地址: https://github.com/JakeYi/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...

  4. 设计模式 - Java中单例模式的6种写法及优缺点对比

    目录 1 为什么要用单例模式 1.1 什么是单例模式 1.2 单例模式的思路和优势 2 写法① - 饥饿模式 2.1 代码示例 2.2 优缺点比较 3 写法② - 懒惰模式 3.1 代码示例 3.2 ...

  5. linux查询及添加用户

    1.查询用户. 存储帐号的文件:/etc/passwd 存储密码的文件:/etc/shadow Cat  /etc/passwd Cat  /etc/shadow 2.添加用户 输入命令: usera ...

  6. Shell—三剑客(grep、sed、awk)

    grep命令详解 文本搜索工具,根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行. 命令格式:grep  [options]  pattern  filename.gr ...

  7. 2018年蓝桥杯B组C/C++决赛题解

    2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...

  8. C++中的异常处理(下)

    array.h #ifndef _ARRAY_H_ #define _ARRAY_H_ #include <stdexcept> using namespace std; template ...

  9. pointcnn

    这篇论文先举例子解释了为什么卷积无法直接应用在点云数据上. 如图1, 传统的卷积是作用在2维图像数据上.图像中每个像素的顺序是固定的,也就是说数据是结构化存储的.直接使用conv2d就能从这种潜在的空 ...

  10. CentOS7 部署 Django 项目

    1. 更新系统软件包 yum update -y 2. 安装软件管理包和可能使用的依赖 yum -y groupinstall "Development tools" yum in ...