偶然发现我用jsoup爬的内容,有一部分中文里面有个别�乱码,但是同一个网页绝大部分中文都是正常的,只有极个别乱码,几经周折终于解决了这个问题,记录以备查
查找问题
对比源网页,发现乱码的地方都是一些生僻字或者繁体字,比如 ”郃“ 、 ”祂“ 、 ”個“
所以我几度怀疑是我的linux服务器字体不全导致的,但是在我的mac系统机器上debug排查后发现并不是这个原因。
而是 Jsoup.connect(url).get()
这个方法可能本来就有点毛病,编码解析的不太好。
解决问题
Jsoup其实提供了通过字节数组的形式返回网页信息的方法,所以我们可以拿到字节数组之后自己编码来解决乱码问题,实测自己编码的情况下,整个网页都没有乱码了,生僻字也能正常解析。
Connection conn = Jsoup.connect("https://www.bequ6.com/8_8778/4727062.html");
byte[] body = conn.execute().bodyAsBytes();
InputStream in = new ByteArrayInputStream(body);
Documet doc = Jsoup.parse(in, "GBK", "https://www.bequ6.com/8_8778/4727062.html");
String tmpTxt = Jsoup.clean(doc.html(), "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
if (StringUtils.isNotBlank(tmpTxt) && tmpTxt.contains("�")) {
InputStream in1 = new ByteArrayInputStream(body);
doc = Jsoup.parse(in1, "UTF-8", href);
}
System.out.println(doc.html());
因为网页常见编码就GBK和UTF-8这俩,其他的gb系列编码用GBK也能正常解码。 所以只需要判断下
parse
后的内容是否有乱码标志,有的话就换一种编码parse
一下就行。 当然如果你有其他编码的需求,加一个if就行了。
ps:Jsoup.clean() 这个方法不能省略,只有clean之后的字符串才是 �
这个乱码标识符,clean之前不是这个。
评论区