我正在寻找Excel中的VBA宏,以确定网页上是否存在字符串“部件可用于此产品”的单个实例。如果宏找到该文本,我就有逻辑去做其余的工作, 但我不想浪费时间或资源来抓取与项目无关的页面在眼前。页面的结构(如果有帮助的话)是table,tbody,tr,然后是td。我要查找的文本封装在td标签中,但该td可能位于不同的tbody标签中。也就是说,目标文本在页面上仅出现一次。如果存在文本,我需要知道文本所在的肢体编号,例如(“肢体”)(4)。
对不起,每个人都很难理解,我通常喜欢添加一些代码,但是我没有任何代码在实现这一目标方面遥遥领先。
答案 0 :(得分:1)
这是一个紧凑函数,它将返回几乎所有指定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
...,然后使用基本的text functions(例如InStr
,Left
,Right
,{{ 1}},Mid
,并在必要时使用Len
,CLng
等将其转换为数字。
答案 1 :(得分:1)
我将把tbody
标记元素放入nodeList
中并循环测试每个节点(每个tbody)的outerHTML
的搜索字符串。如果找到字符串,只需退出循环并打印循环的当前位置。由于nodeList(由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
IE:
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>工具>参考