日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【知识积累】爬虫之网页乱码解决方法(gb2312 -> utf-8)

發布時間:2023/12/29 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 【知识积累】爬虫之网页乱码解决方法(gb2312 -> utf-8) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

  今天在測試爬蟲項目時,發現了一個很嚴肅的問題,當爬取的網頁編碼格式為gb2312時,按照一般的辦法轉化為utf-8編碼時總是亂碼,PS:爬取的所有網頁無論何種編碼格式,都轉化為utf-8格式進行存儲。

一、問題出現

  使用這篇文章里面的方法可以直接爬取頁面信息并保存至本地使用Httpclient實現網頁的爬取并保存至本地,當爬取這個網頁時http://stock.10jqka.com.cn/zhuanti/hlw_list/,發現使用之前(未知編碼 -> utf-8編碼)的轉化方式總是亂碼。于是乎查閱了不少資料,發現都不是太適用。最后自己摸索出了一個解決辦法,也特此記錄。

二、解決方案

  1. 將gb2312格式轉化為gbk格式

  2. 將gbk格式轉化為utf-8格式

  這里的轉化需要使用gbk作為一個中間格式,作為轉化橋梁。

三、具體思路

  1. 當打開http://stock.10jqka.com.cn/zhuanti/hlw_list/這個鏈接,我們查看源碼會發現編碼格式為gb2312,如下圖所示

  

  2. 由于本項目之前就已經使用了轉化方案,但是此轉化方案對網頁為gb2312格式無效,本項目之前的轉化方案的核心源代碼為: 

public void getContent(String url) {
        this.get = new HttpGet(url);
        HttpResponse response = client.execute(this.get);
        HttpEntity entity = response.getEntity();
        byte[] bytes = EntityUtils.toByteArray(entity);
        String content = new String(bytes);
        // 默認為utf-8編碼
        String charset = "utf-8";
        // 匹配<head></head>之間,出現在<meta>標簽中的字符編碼
        Pattern pattern = Pattern.compile("<head>([\s\S]*?)<meta([\s\S]*?)charset\s*=(")?(.*?)"");
        Matcher matcher = pattern.matcher(content.toLowerCase());
        if (matcher.find()) {    
            charset = matcher.group(4);
        } 
        // 將目標字符編碼轉化為utf-8編碼
        String temp = new String(bytes, charset);
        byte[] contentData = temp.getBytes("utf-8");
        return contentData;
    }

View Code

  這種方案對gb2312轉化后還是亂碼,之后的解決方案核心源代碼為:  

public void getContent(String url) {
        this.get = new HttpGet(url);
        HttpResponse response = client.execute(this.get);
        HttpEntity entity = response.getEntity();
        byte[] bytes = EntityUtils.toByteArray(entity);
        String content = new String(bytes);
        // 默認為utf-8編碼
        String charset = "utf-8";
        // 匹配<head></head>之間,出現在<meta>標簽中的字符編碼
        Pattern pattern = Pattern.compile("<head>([\s\S]*?)<meta([\s\S]*?)charset\s*=(")?(.*?)"");
        Matcher matcher = pattern.matcher(content.toLowerCase());
        if (matcher.find()) {    
            charset = matcher.group(4);
            if (charset.equals("gb2312")) {
                byte[] gbkBytes = new String(bytes, "gbk").getBytes();
                return new String(gbkBytes, "utf-8").getBytes();
            }
        } 
        // 將目標字符編碼轉化為utf-8編碼
        String temp = new String(bytes, charset);
        byte[] contentData = temp.getBytes("utf-8");
        return contentData;
    }

View Code

  通過這種方式我們就可以解決gb2312編碼轉化為utf-8編碼時出現的亂碼問題。

四、總結

  多思考,多動腦,這里只是給出了一個工程解決方案,并沒有深入到其中的原理,由此問題可以引申出很多有意思的問題,如,utf-8、gbk、gb2312的編碼方式怎樣的?為什么這樣轉化就可以解決問題?這些問題值得我們去深入研究。由于本篇文章主要是講工程解決方案,感興趣的讀者可以去深入了解。謝謝各位園友觀看~

  附送一篇關于爬蟲亂碼問題解決的很好的文章,網絡爬蟲的亂碼處理 ,講得很不錯,有做爬蟲的園友遇到這一部分的問題時可以好好參考參考。

總結

以上是生活随笔為你收集整理的【知识积累】爬虫之网页乱码解决方法(gb2312 -&gt; utf-8)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。