使用 Excel VBA 确定网页中是否存在文本



我正在寻找Excel中的VBA宏,以确定网页上是否存在字符串"此产品可用的部件"的单个实例。如果宏找到该文本,我已经有逻辑来完成我需要做的其余事情但我不想浪费时间或资源来抓取与手头项目无关的页面。页面的结构,如果有帮助的话,是表格,tbody,tr,然后是td。我正在寻找的文本封装在 td 标签中,但该 td 可能位于不同的 tbody 标签中。也就是说,目标文本仅在页面上出现一次。如果文本存在,我需要知道文本所在的正文编号,例如("tbody"((4(。

对不起大家,这对我来说只是一个很难破解的难题,我通常喜欢添加一些代码,但我没有任何代码可以远程成功实现这一目标。

这是一个紧凑的函数,将返回几乎任何指定 URL 的源代码(如 HTML(:

Public Function getHTTP(ByVal url As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False: .Send
getHTTP = StrConv(.responseBody, vbUnicode)
End With
End Function

。然后,您可以使用InStr来检查您的字段名称是否存在于页面源代码中,如下所示:

Dim url as String, html as String, sPos as Long
url = "http://yourDomain.com/yourPage.html"
html = getHTTP(url)
stsPos rPos = InStr(html,"string to find")
Debug.Print "Your string begins at character position #" & sPos 

。然后你使用基本的文本函数找到你要找的特定值,如InStrLeftRightMidLen,必要时使用CLngCDbl等转换为 niumber。

我会将tbody标签元素抓取到一个nodeList中并循环,以测试搜索字符串的每个节点(每个主体(的outerHTML。如果找到字符串,只需退出循环并打印循环的当前位置。由于nodeLists(由querySelectorAll返回(是基于0的,我在打印的数字上加1。

以下是带有XMLHTTP(假设响应中存在数据(和IE的版本。请注意,由于页面上的 javascript 内容没有为 XMLHTTP 版本呈现,因此这两个示例中的位置是不同的。

XMLHTTP:

Public Sub FindTbodyContainingText()
Dim sResponse As String, html As HTMLDocument, i As Long, tBodies As Object
Const SEARCH_TEXT As String = "Listar identificadores"
Const URL = "https://sidra.ibge.gov.br/Tabela/3653"
Set html = New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
html.body.innerHTML = sResponse
Set tBodies = html.querySelectorAll("tbody")
For i = 0 To tBodies.Length - 1
If InStr(tBodies.item(i).outerHTML, SEARCH_TEXT) > 0 Then
Debug.Print i + 1
Exit For
End If
Next
End Sub

即:

Public Sub FindBodyContainingText()
Dim IE As New InternetExplorer, i As Long, tBodies As Object
Const SEARCH_TEXT As String = "Listar identificadores"
Const URL = "https://sidra.ibge.gov.br/Tabela/3653"
With IE
.Visible = True
.Navigate2 URL
While .Busy Or .readyState < 4: DoEvents: Wend
Set tBodies = .document.querySelectorAll("tbody")
For i = 0 To tBodies.Length - 1
If InStr(tBodies.item(i).outerHTML, SEARCH_TEXT) > 0 Then
Debug.Print i + 1
Exit For
End If
Next
.Quit
End With
End Sub

引用:

VBE>工具>参考

  1. Microsoft 对象库
  2. 列表项

最新更新