Power Query中用自定義函數處理GBK編碼的URL編碼

問題:我們在做網絡抓取時,會遇到URL轉碼的問題,很多網站默認使用UTF-8進行URL編碼,這種好些,Power Query中的URI類函數,也是默認UTF-8編碼,但是也有部分的網站尤其中國的網站,喜歡用GBK編碼,這個時候就不能直接使用URI來編碼了。那麼要如何解決這個GBK的URL編碼問題呢?

我們可以通過自定義函數的方法,自己寫一個GBKURIEncoding函數做漢字到URL的轉碼用。

我們先來了解一下Power Query自帶的兩個函數:

Uri.BuildQueryString 函數

Power Query中用自定義函數處理GBK編碼的URL編碼

這個函數是用來生成網絡查詢參數的函數,例如我們要查詢的參數之一是:

shengji=遼寧省

我們要引用這個函數就要這樣來寫:

=Uri.BuildQueryString([shengji="遼寧省"])

我們來看運行的結果:

Power Query中用自定義函數處理GBK編碼的URL編碼

我們就可以把生成的這個文本作為網絡抓取的參數,連接到網址中。

Uri.EscapeDataString

Power Query中用自定義函數處理GBK編碼的URL編碼

這個函數就更簡單了,我們只需要直接引用漢字部分就可以了,不需要按照record的格式來書寫:

= Uri.EscapeDataString("遼寧省")

Power Query中用自定義函數處理GBK編碼的URL編碼

上面兩個函數,可以直接應用在UTF-8編碼格式的URL轉碼中,絕對好用。

接下來我們來看一個對比:

同樣是“遼寧省”,GBK與UTF-8得到的結果完全不同

  • GBK:%C1%C9%C4%FE%CA%A1
  • UTF-8:%E8%BE%BD%E5%AE%81%E7%9C%81
Power Query中用自定義函數處理GBK編碼的URL編碼

其實這個URL編碼,就是16進制的編碼前面加上一個百分號%

我們就可以根據這個特徵,自己來編寫一個函數,完成這個URL編碼轉換。

GBK編碼

首先我們要解決的問題是,能不能把一段文字變成GBK編碼?當然可以,我們用

Text.ToBinary("遼寧省",20936)

實現文字編碼的轉換,這裡的20936對應的是GB2312-80

大家在導入文本文件的時候是不是看到了有編碼選擇的下拉菜單,那裡面有各個國家的各種語言的編碼以及代碼,GB2312對應的是936,我們可以直接使用數字來做編碼轉換。

Power Query中用自定義函數處理GBK編碼的URL編碼

十六進制

然後我們要把這個二進制的遼寧省轉換成十六進制:

Power Query中用自定義函數處理GBK編碼的URL編碼

= Binary.ToText(GBK,BinaryEncoding.Hex)

  • HEX:c1c9c4fecaa1
  • GBK:%C1%C9%C4%FE%CA%A1

比較一下,是不是就少了幾個百分號%

合成

插入百分號%組合文本,這個步驟辦法就很多了:

Power Query中用自定義函數處理GBK編碼的URL編碼

= Text.Combine(List.Transform( List.Numbers(0,Text.Length(HEX)/2,2),each "%"&Text.Range(HEX,_,2)))

這樣應該也可以:

Power Query中用自定義函數處理GBK編碼的URL編碼

= "%"&Text.Combine(List.Transform(List.Split(Text.ToList(HEX),2),each Text.Combine(_)),"%")

無非就是循環、插入、合併,總之生成了這個結果就可以:

%c1%c9%c4%fe%ca%a1

生成函數

我們把上述的步驟變成一個公式,然後添加函數參數,就可以了:

Power Query中用自定義函數處理GBK編碼的URL編碼

(url) =>"%"&

Text.Combine(

List.Transform(

List.Split(

Text.ToList(

Binary.ToText(

Text.ToBinary(url,20936),BinaryEncoding.Hex)

),

2),

each Text.Combine(_)),

"%")

我們來做個測試:

Power Query中用自定義函數處理GBK編碼的URL編碼

通過這個GBK的編碼生成的URL代碼,連接到網絡,就能夠順利的抓取數據了:

Power Query中用自定義函數處理GBK編碼的URL編碼


分享到:


相關文章: