爬取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. Java之线程与进程

    一.线程与进程 线程:一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别形式,但多线程使用了更小的资源开销. 进程:一个进程包括 ...

  2. CSS @charset规则

    定义和用法 @charset规则指定样式表中使用的字符编码.@charset规则必须在样式表中的第一元素,而不是由任何字符之后进行.在外部样式文件中使用.如果@charset定义了多个规则,则仅使用第 ...

  3. 按需动态加载js

    有些时间我们希望能按需动态加载js文件,而不是直接在HTML中写script标签. 以下为示例代码: var js = document.createElement('script'); js.asy ...

  4. h5本地存储登录页面实现记住密码功能

    <!DOCTYPE html> <html> <head> <title></title> </head> <style ...

  5. django支付宝支付集成

    概要 本文是关于django集成支付宝[电脑网站支付]功能的过程记录. 功能逻辑主要分为两块: 用户下单跳转至支付宝支付界面 支付成功的回调验证 本文用到的alipay-sdk是基于阿里开发文档htt ...

  6. Linux 登录 MySQL 报错, 解决bash: mysql: command not found 的方法

    原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件. 首先得知道mysql ...

  7. 『009』Python

    『004』索引-Language Python 准备更新中

  8. CodeForces - 573A (简单数论+模拟)

    题意 https://vjudge.net/problem/CodeForces-573A 有n个数ai​ ,你可以把每个数任意次×2 或×3 ,问能否最终使得每个数相等. 思路 x2和x3只能改变数 ...

  9. char数据类型

    char数据类型就是为了中文 一个中文占两个字节正好char是占用两个字节 char a='国'’; char类型必须使用单引号属于字符类型 双引号的是字符串类型如果使用等号两边数据类型不一致就是 不 ...

  10. 初识 RESTful API规范

    简介 一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. rest是一种 ...