spider JAVA如何判斷網頁編碼

來源:互聯網
上載者:User

前言

  最近做一個搜尋項目,需要爬取很多網站擷取需要的資訊。在爬取網頁的時候,需要獲得該網頁的編碼,不然的話會發現爬取下來的網頁有很多都是亂碼。

 

分析

  一般情況下,網頁頭資訊會指定編碼,可以解析header或者meta獲得charset。但有時網頁並沒沒有指定編碼,這時就需要通過網頁內容檢測編碼格式,通過調研,最好用的還是cpdetector。 

  cpdetector自動檢測文本編碼格式,誰先返回非空,就以該結果為字元編碼。內建了一些常用的探測實作類別,這些探測實作類別的執行個體可以通過add方法加進來,如等,detector按照“誰先返回非空的探測結果,就以誰的結果為準”的原則返回探測到的字元集編碼。

 

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

  網頁頭資訊中的Content-Type會指定編碼,

  

  可以通過分析header,尋找字元編碼。

Map<String, List<String>> map = urlConnection.getHeaderFields();Set<String> keys = map.keySet();Iterator<String> 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("]", "");            return strencoding;        }    }}

 

2、其次,可從網頁meta中解析出charset

  正常情況下,在寫網頁時,會指定網頁編碼,可在meta中讀出來。

  

  首先擷取網頁流,因為英文和數字不會亂碼,可以解析meta,獲得charset。

StringBuffer sb = new StringBuffer();String line;try {    BufferedReader in = new BufferedReader(new InputStreamReader(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   <URL>   [<filename>]");}String htmlcode = sb.toString();// 解析html源碼,取出<meta />地區,並取出charsetString strbegin = "<meta";String strend = ">";String strtmp;int begin = htmlcode.indexOf(strbegin);int end = -1;int inttmp;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(" ", "");            return strencoding;        }    }    htmlcode = htmlcode.substring(begin);    begin = htmlcode.indexOf(strbegin);}

 

3、當使用1、2解析不出編碼時,使用cpdetector根據網頁內容探測出編碼格式

  可以添加多個編碼探測執行個體:

public static void getFileEncoding(URL url) throws MalformedURLException, IOException {    CodepageDetectorProxy codepageDetectorProxy = CodepageDetectorProxy.getInstance();        codepageDetectorProxy.add(JChardetFacade.getInstance());    codepageDetectorProxy.add(ASCIIDetector.getInstance());    codepageDetectorProxy.add(UnicodeDetector.getInstance());    codepageDetectorProxy.add(new ParsingDetector(false));    codepageDetectorProxy.add(new ByteOrderMarkDetector());    Charset charset = codepageDetectorProxy.detectCodepage(url);    System.out.println(charset.name());    }}

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.