VBA如何将雅虎财经爬取的含未知字符的异常日期字符串转为Date格式
雅虎财经爬取日期异常问题解决方案
方案1:识别并移除未知特殊字符
你可以先通过编码定位异常字符,再针对性替换:
首先运行如下代码输出字符串中每个字符的Unicode编码,定位异常字符:
Sub CheckCharCode(ByVal inputStr As String) Dim i As Long For i = 1 To Len(inputStr) Debug.Print "第" & i & "个字符:""" & Mid(inputStr, i, 1) & """,编码:" & AscW(Mid(inputStr, i, 1)) Next End Sub
运行后在立即窗口查看编码,常见的隐形字符编码包括160(非断空格)、8203(零宽空格)、8206/8207(方向控制符),确认编码后用如下代码替换即可:
' 示例:移除编码为8206的方向控制符和160的非断空格 DateString = Replace(DateString, ChrW(8206), "") DateString = Replace(DateString, ChrW(160), "") ' 替换完成后即可正常用CDate转换 Worksheets("Stock_data").Range("A2").Value = CDate(DateString)
方案2:直接转换异常格式字符串为日期
推荐用正则表达式提取有效日期内容,完全跳过特殊字符处理:
可以直接用迟绑定调用正则,不需要提前引用库:
Function ExtractValidDate(ByVal inputStr As String) As Date Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Global = False ' 匹配 日+3位月份+4位年份的格式,忽略中间的特殊字符 reg.Pattern = "(\d{1,2})[^A-Za-z]*([A-Za-z]{3})[^0-9]*(\d{4})" If reg.test(inputStr) Then Dim matches As Object Set matches = reg.Execute(inputStr) ' 拼接为标准日期字符串再转换 ExtractValidDate = CDate(matches(0).SubMatches(0) & " " & matches(0).SubMatches(1) & " " & matches(0).SubMatches(2)) End If End Function ' 调用方法 Worksheets("Stock_data").Range("A2").Value = ExtractValidDate(DateString)
方案3:优化爬取逻辑从根源避免问题
你当前使用innerText获取内容,会携带渲染生成的隐形控制字符,有两种更可靠的爬取方式:
方式1:改用textContent获取纯文本
DOM元素的textContent属性只会返回节点的纯文本内容,不会携带渲染相关的隐形字符,修改爬取代码即可:
DateString = doc.getElementsByClassName("Py(10px) Ta(start) Pend(10px)")(j).textContent
方式2:直接抓取时间戳属性(最推荐)
雅虎财经历史价格表格的日期单元格自带Unix时间戳属性,不需要处理任何字符串即可直接转日期:
Dim dateEle As Object Set dateEle = doc.getElementsByClassName("Py(10px) Ta(start) Pend(10px)")(j) ' 获取10位Unix时间戳 Dim timeStamp As Long timeStamp = dateEle.getAttribute("data-date") ' 时间戳转北京时间(东八区) Dim finalDate As Date finalDate = DateAdd("s", timeStamp, "1970-01-01 08:00:00") Worksheets("Stock_data").Range("A2").Value = finalDate
内容的提问来源于stack exchange,提问作者Jirka Čep
相关产品推荐
相关产品推荐

