我正在寻找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
。然后你使用基本的文本函数找到你要找的特定值,如InStr
、Left
、Right
、Mid
、Len
,必要时使用CLng
、CDbl
等转换为 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>工具>参考
- Microsoft 对象库
- 列表项