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编码


分享到:


相關文章: