java 获取网页编码_spider JAVA如何判断网页编码

前言

最近做一个搜索项目,需要爬取很多网站获取需要的信息。在爬取网页的时候,需要获得该网页的编码,不然的话会发现爬取下来的网页有很多都是乱码。

分析

一般情况下,网页头信息会指定编码,可以解析header或者meta获得charset。但有时网页并没没有指定编码,这时就需要通过网页内容检测编码格式,通过调研,最好用的还是cpdetector。

cpdetector自动检测文本编码格式,谁先返回非空,就以该结果为字符编码。内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法加进来,如

3048361027bd20d782500143dc29f340.png

bee01b72eac5a0fbe539e9b9307022d1.png

8cb3945b7ba488d5216f9e148eede1e2.png等,detector按照“谁先返回非空的探测结果,就以谁的结果为准”的原则返回探测到的字符集编码。

1、首先,可从header中解析charset

网页头信息中的Content-Type会指定编码,如图:

cf0bb4c6c4e605dd059d5a022587cfe6.png

可以通过分析header,查找字符编码。

Map> map =urlConnection.getHeaderFields();

Set keys =map.keySet();

Iterator iterator =keys.iterator();//遍历,查找字符编码

String key = null;

String tmp= null;while(iterator.hasNext()) {

key=iterator.next();

tmp=map.get(key).toString().toLowerCase();//获取content-type charset

if (key != null && key.equals("Content-Type")) {int m = tmp.indexOf("charset=");if (m != -1) {

strencoding= tmp.substring(m + 8).replace("]", "");returnstrencoding;

}

}

}

2、其次,可从网页meta中解析出charset

正常情况下,在写网页时,会指定网页编码,可在meta中读出来。如图:

437fc032b52e1fe62290bd2a5ad4d31e.png

首先获取网页流,因为英文和数字不会乱码,可以解析meta,获得charset。

StringBuffer sb = newStringBuffer();

String line;try{

BufferedReader in= new BufferedReader(newInputStreamReader(url

.openStream()));while ((line = in.readLine()) != null) {

sb.append(line);

}

in.close();

}catch (Exception e) { //Report any errors that arise

System.err.println(e);

System.err

.println("Usage: java HttpClient []");

}

String htmlcode=sb.toString();//解析html源码,取出区域,并取出charset

String strbegin = "

String strend= ">";

String strtmp;int begin =htmlcode.indexOf(strbegin);int end = -1;intinttmp;while (begin > -1) {

end=htmlcode.substring(begin).indexOf(strend);if (begin > -1 && end > -1) {

strtmp= htmlcode.substring(begin, begin +end).toLowerCase();

inttmp= strtmp.indexOf("charset");if (inttmp > -1) {

strencoding= strtmp.substring(inttmp + 7, end).replace("=", "").replace("/", "").replace("\"", "")

.replace("\'", "").replace(" ", "");returnstrencoding;

}

}

htmlcode=htmlcode.substring(begin);

begin=htmlcode.indexOf(strbegin);

}

3、当使用1、2解析不出编码时,使用cpdetector根据网页内容探测出编码格式

可以添加多个编码探测实例:

public static void getFileEncoding(URL url) throwsMalformedURLException, IOException {

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(url);

System.out.println(charset.name());

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值