调用GetElementByRegex爬取Alexa数据返回空值的问题咨询
嘿,我来帮你排查这个问题!你的VBA函数在处理A2的Alexa页面时返回空值,主要有两个关键问题,咱们一步步解决:
1. 正则匹配失败的核心原因
你用的正则表达式<!-- Alexa web traffic metrics are available via our API at http://aws.amazon.com/awis -->(.*?)</strong>,默认情况下VBScript的正则里,.是不匹配换行符的。而Alexa页面的返回内容里,那段注释和</strong>标签之间肯定有换行或者大量空白字符,导致.*?没法跨换行抓到目标内容。
解决办法很简单:给正则对象开启Singleline模式,这个模式会让.匹配包括换行在内的所有字符,就能覆盖注释到闭合标签之间的所有内容了。
2. 函数里的隐藏bug:未定义的index参数
你的函数定义只有url和reg两个参数,但代码里却用了IsMissing(index)——这其实会触发运行时错误!IsMissing只能用于可选的Variant类型参数,所以必须修改函数定义,把index设为可选参数才行。
修复后的完整VBA代码
Public Function GetElementByRegex(url As String, reg As String, Optional index As Variant) As String Dim XMLHTTP As Object, regEx As Object, matches As Object Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP") XMLHTTP.Open "GET", url, False XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0" ' 删掉了不必要的Content-Type头,请求HTML页面不需要这个 XMLHTTP.send Set regEx = CreateObject("VBScript.RegExp") regEx.Pattern = reg regEx.Global = True ' 开启Singleline模式,让.能匹配换行 regEx.Singleline = True If regEx.Test(XMLHTTP.ResponseText) Then Set matches = regEx.Execute(XMLHTTP.ResponseText) If IsMissing(index) Then GetElementByRegex = matches(0).SubMatches(0) Else ' 加个边界判断,避免索引越界报错 If index < matches.Count Then GetElementByRegex = matches(index).SubMatches(0) Else GetElementByRegex = "" End If End If Exit Function End If GetElementByRegex = "" End Function
额外的小建议
- 我删掉了
Content-Type: text/xml这个请求头,因为你请求的是HTML页面,这个头会让服务器返回错误的内容类型,反而可能干扰结果。 - 新增了index参数的边界判断,防止你传入的索引超出匹配结果的数量导致报错。
- 如果还是不确定正则是否正确,可以先把
XMLHTTP.ResponseText输出到某个单元格(比如在函数里加一行Range("B2").Value = XMLHTTP.ResponseText),看看页面的实际内容格式,再调整正则表达式。
内容的提问来源于stack exchange,提问作者Hugues Lin
相关产品推荐
相关产品推荐

