java获取网页编码_java根据URL获取网页编码

由于很多原因,我们要获取网页的编码(多半是写批量抓取的脚本吧...嘻嘻嘻)

注意:

如果你的目的是获取不乱码的网页内容(而不是根据网址发送post请求获取返回值),切记切记,移步这里

先说思路:

有三种方法:

1,根据responseHeaders获取Content-Type里的charset,如下图

f06f30d64eaea5c0a670be3326bfa023.png

这种方法最好,最推荐,然而,很多网站都没有,要么是像百度这样:

59c50962f73cc95e682f45a6a748955b.png

有Content-Type,然而没有指定charset

要么是像博客园这样:

b16bf6ee46a270c4904a1e8fd46576be.png

???Content-Type都不给我么...???

c6469722bb50368bb1a4fec2cca6c5c2.png

所以虽然这种方法最准确.但是...并不是每个网站都有的...

2.根据html标签里的meta取

这里还以百度为例:

70cd352cf0f07d933d88252dc7444305.png

怎么取标签,我就不说了,如果不会就留言,如有需要我再写博客(然而也没什么人看我博客,更没什么人会留言...悲伤...我就默认你们都会取了)

虽然中文乱码,但是英文是不乱的,哪怕你不知道编码,随便用个GBK,UTF-8都能取...

但是,这种方法不准...不保证一定能取到正确的

并且..由于这种方法你还得拿到HTML内容...所以,还得判断一下是不是GZIP方式压缩了...贼麻烦...所以我就放弃了

3.通过第三方库,去猜格式

这种方法,原则上讲是存在一定的猜错几率的...

原理是同时进行多种编码的尝试(gb2312啊,utf-8啊,windows-XXXX啊),哪个先返回正确的格式就认定是哪个...虽然根据我的尝试很准,然而理论上还是会不贴切的,没有第一种准.

0281362e861582aea47b25080ac4a958.png

b421c46fedcb349cf8de1438d48c54bc.png

切记切记,总共是4个jar包...别的教程里并没有告诉我,害得我分别去找这三个编码jar包,好气...最后才发现原来就在这个压缩包里...吃了眼瞎的亏了

这四个jar包放进你项目里就行

最后,经过慎重的考虑与取舍,我决定先用第一种方法取(毕竟最准确),放弃第二种方法(贼麻烦...),第一种取不到了,再用第三种猜,如下

public staticString getUrlCharset(String url){try{

String urlNameString=url;

URL realUrl= newURL(urlNameString);//打开和URL之间的连接

URLConnection connection =realUrl.openConnection();//设置通用的请求属性

connection.setRequestProperty("accept", "*/*");

connection.setRequestProperty("connection", "Keep-Alive");

connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");//建立实际的连接

connection.connect();//获取所有响应头字段

Map> map =connection.getHeaderFields();//遍历所有的响应头字段

System.out.println("Content-Type" + "--->" + map.get("Content-Type"));

List list=map.get("Content-Type");if (list.size()>0){

String contentType=list.toString().toUpperCase();if (contentType.contains("UTF-8")){return "UTF-8";

}if(contentType.contains("GB2312")){return "GB2312";

}if (contentType.contains("GBK")){return "GBK";

}

}//如果相应头里面没有编码格式,用下面这种

CodepageDetectorProxy codepageDetectorProxy =CodepageDetectorProxy.getInstance();

codepageDetectorProxy.add(JChardetFacade.getInstance());

codepageDetectorProxy.add(ASCIIDetector.getInstance());

codepageDetectorProxy.add(UnicodeDetector.getInstance());

codepageDetectorProxy.add(new ParsingDetector(false));

codepageDetectorProxy.add(newByteOrderMarkDetector());

Charset charset= codepageDetectorProxy.detectCodepage(newURL(url));returncharset.name();

}catch(Exception e){}return null;

}

如果返回值是null,那很不幸,我也不知道哪里出异常了,自己debug解决吧,嘻嘻.一般是没事.最多就是网络不好timeout了

就这样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值