VBA网抓字符转换

VBA虽然不是专业爬虫工具,但是Excel删除后续数据处理与分析,所以对于不复杂的网页数据抓取也经常在VBA来实现。
有些时候,在网页中看到的内容,使用浏览器的“审查元素”功能也可以看到的内容,如下图。

但是用代码抓取回来就只有如下的字符串,面目全非完全无法认读。

北京天安门

怎么回事呢,这是由于网页中使用了字符的UTF编码,在浏览器中加载页面的时候可以自动转换为中文字符,HTML源码如下。

<html>
    <body>
        <p>&#X5317;&#X4EAC;&#X5929;&#X5B89;&#X95E8;</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行输入转换结果,如下图所示。

发布了107 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/taller_2000/article/details/90473670
vba