VBA虽然不是专业爬虫工具,但是Excel删除后续数据处理与分析,所以对于不复杂的网页数据抓取也经常在VBA来实现。
有些时候,在网页中看到的内容,使用浏览器的“审查元素”功能也可以看到的内容,如下图。
但是用代码抓取回来就只有如下的字符串,面目全非完全无法认读。
北京天安门
怎么回事呢,这是由于网页中使用了字符的UTF编码,在浏览器中加载页面的时候可以自动转换为中文字符,HTML源码如下。
<html>
<body>
<p>北京天安门</p>
</body>
</html>
既然已经抓取到了UTF编码的字符,在VBA是否可以转换为中文呢?VBA中有StrConv
可以实现Unicode转换,通常网页中会使用十六进制的表示形式,所以在VBA中还需要借助工作表函数实现进制转换,可以实现但是有些繁琐。
处理HTML肯定是JavaScript最方便了,在VBA中调用JavaScript实现这个转换就可以了。
Sub JSDemo()
Dim strCN, strHex, strNew
With CreateObject("MSScriptControl.ScriptControl")
.Language = "javascript"
strJSCode = "function StrToHex(r){for(var t='',n=0;n<r.length;n++)t+='&#x'+r.charCodeAt(n).toString(16)+';';return t}"
.AddCode strJSCode
strJSCode = "function HexToStr(r){var n='',t=r.replace(';','').split('&#x');for(i=1;i<t.length;i++)n+=String.fromCharCode(parseInt(t[i],16));return n}"
.AddCode strJSCode
strCN = "北京天安门"
strHex = .Run("StrToHex", strCN)
strNew = .Run("HexToStr", strHex)
End With
Debug.Print UCase(strHex)
MsgBox "原始字符" & vbTab & strCN & vbNewLine & _
"转换后" & vbTab & strHex & vbNewLine & _
"逆转换" & vbTab & strNew
End Sub
【代码解析】
第3行代码创建ScriptContrl对象。
第4行代码指定语言为JavaScript。
第5行到第8行代码添加两个JavaScript的函数,其中StrToHex
实现字符串转换UTF编码,HexToStr
实现UTF转换为字符串。JavaScript代码就不再讲解了。
第9行指定测试字符串。
第14行输入转换结果,如下图所示。