【问题标题】:VBA Web Scraping: Object turns out empty (getelementbyID)VBA Web Scraping:对象变为空(getelementbyID)
【发布时间】:2020-05-20 01:01:23
【问题描述】:

我打算从以下网站(网站为马来语)中提取包含招标信息的信息。 https://tender.selangor.my/results?type=tenders

我的代码如下,但 'tenders' 对象显示为 Nothing 导致我无法继续进行。希望你能分享一些关于我做错了什么的指导。

Worksheets("Data").Cells.Clear

Dim xhr As Object
Dim html As New HTMLDocument
Dim tenders As Object, item As Object, item2 As Object
Dim tender As Object
Dim i As Integer

Set xhr = CreateObject("MSXML2.XMLHTTP")

With xhr
    .Open "GET", "https://tender.selangor.my/results?type=tenders", False
    .send

    If .readyState = 4 And .Status = 200 Then
        html.body.innerHTML = .responseText
    Else
        MsgBox "Error" & vbNewLine & "Ready state: " & .readyState & _
        vbNewLine & "HTTP request status: " & .Status
    End If

End With

Set tenders = html.getElementById("DataTables_Table_0")

【问题讨论】:

  • 该页面上不存在DataTables_Table_0 元素。是什么让您认为它存在?

标签: html vba dom web-scraping


【解决方案1】:

您感兴趣的表格内容是动态生成的,因此您可以使用Internet Explorer 或发出带有适当参数的get http 请求来使用第三方库解析json 内容。由于第一个选项很容易使用,我创建了一个使用相同的示例:

Sub GetInformation()
    Dim tenders As Object

    With CreateObject("InternetExplorer.Application")
        .Visible = True
        .navigate "https://tender.selangor.my/results?type=tenders"
        While .Busy Or .readyState < 4: DoEvents: Wend
        Application.Wait Now + TimeValue("00:00:05")
        Set tenders = .document.getElementById("DataTables_Table_0")
        Debug.Print tenders.innerText
        .Quit
    End With
End Sub

【讨论】:

  • 感谢您通过示例进行清晰的解释。我的错误是没有意识到 DOM 检查器和实际 HTML 文件之间的区别。我相信您的示例通过等待加载(?)来模拟内容的动态生成。再次感谢。我还将研究使用 3rd 方库解析 JSON,因为这似乎在 IE 成为 MS Edge 的未来非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2021-09-03
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多