侧边栏壁纸
博主头像
luoxx博主等级

只要思想不滑坡,办法总比困难多

  • 累计撰写 59 篇文章
  • 累计创建 64 个标签
  • 累计收到 1,321 条评论

目 录CONTENT

文章目录

解决Jsoup抓取网页部分中文乱码(生僻字、繁体字)乱码

luoxx
2022-05-07 / 0 评论 / 2 点赞 / 3,097 阅读 / 498 字
温馨提示:
本文最后更新于 2022-05-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除,邮箱地址:luoxmc@vip.qq.com

偶然发现我用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之前不是这个。

2

评论区