【问题标题】:Open website, find specific value and return value to Excel in VBA打开网站,在 VBA 中查找特定值并将值返回到 Excel
【发布时间】:2017-06-18 19:47:00
【问题描述】:

我想用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

【问题讨论】:

  • 可以发一下网址吗?
  • 很遗憾,我无法发布网站链接,您也无法访问,但如果需要,我可以分享一些 HTML

标签: vba excel internet-explorer


【解决方案1】:

使用网络请求代替打开 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 之后执行循环,直到遇到“&lt;”字符。

【讨论】:

  • 这正是我的想法 - 非常感谢!如何将结果值返回到 Excel,例如用于变量等?
  • 我将 (Dim) sUrl 定义为字符串并将我的 URL 分配给它。我如何在这里定义 oRequest ?
  • oRequest 是一个WinHttp.WinHttpRequest。你有安装那个库吗?另外,这是在 Excel 程序中吗?如果是这样,您应该可以执行Cells(row, col).Value = text 之类的操作
【解决方案2】:
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

【讨论】:

  • 非常感谢!我是否正确理解这将列出站点中的所有元素值?如何仅从我的类的 p 元素中获取值以及如何将其返回到 Excel,例如在变量中?
  • 这将返回页面中具有您指定的类名的所有对象,并将其放入单元格 A1。
  • 再次感谢!这也很好,但是当我运行它时,调试器会在这一行开始: Set doc = objIE.document - How do I have to define (Dim) doc here?
  • 是的,将其声明为对象。
  • 还是同样的问题
【解决方案3】:

这是一个棘手而有趣的问题。假设您要获取当前网站的标题,该标题位于 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,您可以在字符串中获取标题并进一步工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多