【问题标题】:Using Excel VBA To Determine If Text Exists In Webpage [closed]使用 Excel VBA 确定网页中是否存在文本 [关闭]
【发布时间】:2018-10-20 01:52:08
【问题描述】:

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

对不起大家,这对我来说只是一个难题,我通常喜欢添加一些代码,但我没有任何代码能够成功实现这一目标。

【问题讨论】:

  • 对于特定的东西,我会拉出整个页面并使用InStr(html, "Parts are available...")
  • 我更新了问题以使请求更加具体,因为您概述的内容将解决这个问题,但我没有像我应该做的那样具体或明确。对此我深表歉意。
  • 在这种情况下,您需要包含代码和页面链接。
  • 不幸的是,我的代码并没有解决这个问题,它解决了抓取 if 文本存在的问题。我为确定文本是否存在所做的所有尝试似乎都不起作用。基本上,我的代码可以放在“if”语句的“then”部分,但没有代码似乎可以在 if 语句之上或之外工作。
  • 请附上网址和您的代码。只需包含您拥有的代码即可。

标签: excel vba web-scraping


【解决方案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(例如InStrLeftRightMidLen)找到您要查找的特定值,转换为如有必要,使用CLngCDbl 等添加数字。

【讨论】:

    【解决方案2】:

    我会将tbody 标记元素抓取到nodeList 中并循环测试每个节点(每个 tbody )的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
    

    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. 列表项

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2019-10-16
      • 2013-02-05
      • 2021-11-05
      相关资源
      最近更新 更多