打开网站,在VBA中查找特定值并将值返回到Excel

时间:2017-02-15 15:52:25

标签: vba excel-vba internet-explorer excel

我想使用VBA打开一个网站,在本网站的HTML代码中查找某个段落(<p class="myClass">XYZ</p>)并将此值返回到Excel,在我的示例"XYZ"中。

该网站只有一个段落(p元素)与上述类。

我知道这是可能的,但不知道从哪里开始。

我的代码:

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")

With objIE
    .Navigate varUrl
    Do While .Busy
          Application.Wait Now + TimeValue("0:00:01")
    Loop
    .Visible = True
End With

3 个答案:

答案 0 :(得分:2)

使用网络请求,而不是打开IE:

Set oRequest = New WinHttp.WinHttpRequest
With oRequest
    .Open "GET", sUrl, True
    .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
    .Send "{range:9129370}"
    .WaitForResponse
    Set index = .ResponseText.IndexOf("<p class=""myClass"">")
    Set text = .ResponseText.Substring(index,3)
    Cells(row, col).Value = text
End With

如果你不知道你要找的字符串的长度,你也可以在index之后循环,直到你点击“<”字符。

答案 1 :(得分:1)

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")

With objIE
    .Navigate varUrl
    Do While .Busy
          Application.Wait Now + TimeValue("0:00:01")
    Loop
    .Visible = True
End With

'HTML document
Dim doc As Object
Set doc = objIE.document

Dim el As Object
Dim myText as string
For Each el In doc.GetElementsByClassName("myClass")
    'put paragrah text in cell A1
    Cells(1, 1).Value = el.innerText

    'put your paragraph text in a variable string
    myText = el.innerText
Next el

答案 2 :(得分:0)

这是一个棘手而有趣的问题。我们假设你想获得当前网站的标题,该标题位于StackOverflow中的question-hyperlink类中。因此,使用@Matt Spinks解决方案的想法,你可能会想出这样的东西:

Option Explicit

Public Sub TestMe()

    Dim oRequest    As Object
    Dim strOb       As String
    Dim strInfo     As String: strInfo = "class=""question-hyperlink"">"
    Dim lngStart    As Long
    Dim lngEnd      As Long

    Set oRequest = CreateObject("WinHttp.WinHttpRequest.5.1")

    With oRequest
        .Open "GET", "http://stackoverflow.com/questions/42254051/vba-open-website-find-specific-value-and-return-value-to-excel#42254254", True
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
        .Send "{range:9129370}"
        .WaitForResponse
        strOb = .ResponseText

    End With

    lngStart = InStr(1, strOb, strInfo)
    lngEnd = InStr(lngStart, strOb, "<")

    Debug.Print Mid(strOb, lngStart + Len(strInfo), lngEnd - lngStart - Len(strInfo))

End Sub

而不是Debug.print,您可以在字符串中获得标题并进一步工作。