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

时间:2018-10-20 01:52:08

标签: excel vba excel-vba web-scraping

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

对不起,每个人都很难理解,我通常喜欢添加一些代码,但是我没有任何代码在实现这一目标方面遥遥领先。

2 个答案:

答案 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(例如InStrLeftRight,{{ 1}},Mid,并在必要时使用LenCLng等将其转换为数字。

答案 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>工具>参考

  1. Microsoft HTML对象库
  2. 列表项