Jsoup爬取網頁亂碼編碼格式gb2312轉utf8
阿新 • • 發佈:2019-02-08
最近做的一個專案需要爬取股票公告並存儲於mongodb中用來顯示,當我在用jsoup爬取新浪財經股票公告的時候,發現了亂碼問題。網頁連結如下http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletinDetail.php?stockid=600958&id=3735125,開啟控制檯可以看到新浪財經採用的是gb2312的編碼方式,mongodb預設utf8,其實簡體中文不做編碼轉換也是可以儲存,但是例如繁體中文以及特殊字元就會出現亂碼問題。於是寫了段程式來統一編碼格式,程式碼如下:
如有錯誤,歡迎糾正!//獲取公告 public String getAnnouncementFromSina(){ String text = ""; String url = "http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletinDetail.php?stockid=600958&id=3735125"; try{ Document doc = Jsoup.parse(new URL(url).openStream(), "GBK", url); Element element = doc.select("div#content").first().getElementsByTag("pre").first(); //呼叫轉換方法 text = getUTF8BytesFromGBKString(element.text()); }catch (Exception e){ e.printStackTrace(); return null; } return text } //有損轉換 public String getUTF8BytesFromGBKString(String gbkStr) throws UnsupportedEncodingException { int n = gbkStr.length(); byte[] utfBytes = new byte[3 * n]; int k = 0; for (int i = 0; i < n; i++) { int m = gbkStr.charAt(i); if (m < 128 && m >= 0) { utfBytes[k++] = (byte) m; continue; } utfBytes[k++] = (byte) (0xe0 | (m >> 12)); utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f)); utfBytes[k++] = (byte) (0x80 | (m & 0x3f)); } if (k < utfBytes.length) { byte[] tmp = new byte[k]; System.arraycopy(utfBytes, 0, tmp, 0, k); utfBytes = tmp; } return new String(utfBytes,"UTF-8"); }