2015年3月17日 星期二

IMPORTHTML提取中文網頁資料之亂碼解決方式(部分情形可解決)

近來都把試算表的使用重心放在Spredsheet上(暫時對EXCEL失去興趣了XD),為了解決提取網頁資料亂碼問題,爬了許多文才找到下列這個自定函數的運用,此方式並無法完全解決所有網頁的問題

以Spredsheet IMPORTHTML()函數提取中文網頁資料,常會看到一堆亂碼,經比對網頁編碼方式,幾乎確定Spredsheet是預設將資料以"西歐語系"來呈現(網頁設計觀念我不是很懂,似乎是網頁以JvaScript或Ajax獲取資料的編碼設定有關)。

解決方式:請開啟  工具/指令碼編輯器  ,自創新的函數(要記得先編譯過,開放授權後續才能使用自定函數),以下是我用的二個方式,針對不同情況測試
function encode_utf8( s ){
  return Utilities.newBlob("").setDataFromString(s, "ISO-8859-1").getDataAsString("UTF-8") ;
}

function encode_big5( s ){
  return Utilities.newBlob("").setDataFromString(s, "ISO-8859-1").getDataAsString("big5") ;
}

測試一、假如網站資料呈現是繁體中文(BIG5),此方式轉換100%成功,例如台工銀網站證券
(渣打銀行匯率資料也是以繁體中文編碼,但無須任何轉換及可正常顯示,所以問題與網頁編碼形式似乎無多大關聯)

將要轉換的儲存格套上公式即可  =encode_big5( 儲存格 )
底下是轉換的範例

測試二、假如網站資料呈現是UTF-8(轉換方式如上所述方法,改用encode_utf8( )函數),例如公開資訊觀測站資料,很不幸的,轉換後仍然還是有部分亂碼

將IMPORTHTML取得的資料與網頁資料核對(網頁以ISO-8859-1編碼),發現部分內容不一致,才導致轉換無法完全成功,殘念....。

也想過是否誤判提取的資料預設編碼為ISO-8859-1,但更換數種編碼結果仍是失敗,所幸轉換過的內容大致可辨讀。


3 則留言:

  1. 你好,我有將你的文章資料做引用,感謝,有機會希望能跟你多認識學習,歡迎來我的部落格

    回覆刪除
    回覆
    1. 歡迎取用,可以再參考另一篇文章,以補不足的部分
      http://shanhua0131.blogspot.tw/2015/04/blog-post.html

      刪除
  2. 林大哥您好,我想抓取"https://www.cmoney.tw/finance/f00012.aspx"裡面的表格資料,但是都無法成功,請問有什麼方式能分享抓取這個網頁的資料嗎? 非常感謝您的回覆

    回覆刪除