JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案
JSOUP乱码情况产生
这几天我用 JSOUP 多线程的方式,爬取了200
多万数据,数据为各地的地名相关。结果有小部分数据,不到 1
万乱码。我先检查了我的编码为UTF-8
,觉得应该没有问题。代码基本如下如下:
try{
doc = Jsoup.connect(url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0")
.header("Connection", "close")//如果是这种方式,这里务必带上
.timeout(8000)//超时时间
.get();
} catch (Exception e) {//可以精确处理timeoutException
//超时处理
}
而我后来我查看了对方的页面编码,发现对方的页面编码为 GBK
,而返回数据为GB2312
,那我们先尝试一下GBK
。
JSOUP乱码解决
其实在这里如果返回的 Document
乱码,就不用去再做转码了。比如有同学类似这样:
String str = new String(docStr.getBytes("GBK"), "UTF-8");
其实没有太大作用, JSOUP 支持在请求的时候,传入URL
对象,然后设置编码。如下方式才是正解,设置编码为GBK
。
doc = Jsoup.parse(new URL(url).openStream(), "GBK", url);
如果对方是UTF-8
,那就设置为UTF-8
,对应页面的编码,怎么看页面的编码?
这里会显示返回的编码类型和返回的类型,如text/html
,application/json
等等。
还有一种方式查看页面编码。右键页面源码,如下图所示:
这里顺便贴一下,编码设置后并且设置请求头信息的模拟。较为详细的 Demo 。
URL url = new URL("https://www.sojson.com");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
//默认就是Get,可以采用post,大小写都行,因为源码里都toUpperCase了。
connection.setRequestMethod("GET");
//是否允许缓存,默认true。
connection.setUseCaches(Boolean.FALSE);
//是否开启输出输入,如果是post使用true。默认是false
//connection.setDoOutput(Boolean.TRUE);
//connection.setDoInput(Boolean.TRUE);
//设置请求头信息
connection.addRequestProperty("Connection", "close");
//设置连接主机超时(单位:毫秒)
connection.setConnectTimeout(8000);
//设置从主机读取数据超时(单位:毫秒)
connection.setReadTimeout(8000);
//设置Cookie
connection.addRequestProperty("Cookie","你的Cookies" );
//开始请求
Document doc = Jsoup.parse(connection.getInputStream(), "GBK", "https://www.sojson.com");
//TODO ---
哦了,还有问题加群交流吧!QQ群:259217951。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/225.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。