1. 程式人生 > >JSOUP教程,JSOUP 亂碼處理,JSOUP生僻字亂碼解決方案

JSOUP教程,JSOUP 亂碼處理,JSOUP生僻字亂碼解決方案

catch 緩存 dem 頭信息 win64 -- 默認 set 開啟

JSOUP亂碼情況產生 這幾天我用 JSOUP 多線程的方式,爬取了200 多萬數據,數據為各地的地名相關。結果有小部分數據,不到 1 萬亂碼。我先檢查了我的編碼為UTF-8 ,覺得應該沒有問題。代碼基本如下如下: try{ doc = Jsoup.connect(url) .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0") .header("Connection", "close")//如果是這種方式,這裏務必帶上 .timeout(8000)//超時時間 .get(); } catch (Exception e) {//可以精確處理timeoutException //超時處理 }

而我後來我查看了對方的頁面編碼,發現對方的頁面編碼為 GBK ,而返回數據為GB2312 ,那我們先嘗試一下GBK 。

JSOUP亂碼解決 其實在這裏如果返回的 Document 亂碼,就不用去再做轉碼了。比如有同學類似這樣: String str = new String(docStr.getBytes("GBK"), "UTF-8");

其實沒有太大作用, JSOUP 支持在請求的時候,傳入URL 對象,然後設置編碼。如下方式才是正解,設置編碼為GBK 。 doc = Jsoup.parse(new URL(url).openStream(), "GBK", url);

這裏順便貼一下,編碼設置後並且設置請求頭信息的模擬。較為詳細的 Demo 。 URL url = new URL("http://www.sojson.com"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); //默認就是Get,可以采用post,大小寫都行,因為源碼裏都toUpperCase了。 connection.setRequestMethod("GET"); //是否允許緩存,默認true。 connection.setUseCaches(Boolean.FALSE); //是否開啟輸出輸入,如果是post使用true。默認是false //connection.setDoOutput(Boolean.TRUE); //connection.setDoInput(Boolean.TRUE); //設置請求頭信息 connection.addRequestProperty("Connection", "close"); //設置連接主機超時(單位:毫秒)

connection.setConnectTimeout(8000);
//設置從主機讀取數據超時(單位:毫秒)
connection.setReadTimeout(8000);
//設置Cookie connection.addRequestProperty("Cookie","你的Cookies" ); //開始請求 Document doc = Jsoup.parse(connection.getInputStream(), "GBK", "http://www.sojson.com");

//TODO ---

哦了!

JSOUP教程,JSOUP 亂碼處理,JSOUP生僻字亂碼解決方案