使用VBA代码循环问题在iframe中提取数据

时间:2018-09-30 09:46:14

标签: excel vba url web-scraping extract

以下代码在结果上运行良好,并且我已经获得了所需的值。但是在运行过程结束时,它在“带有.document.getElementById(“ bm_ann_detail_iframe”)。contentDocument“行上显示“运行时错误'424'对象必需”。

用于从以下位置提取数据的示例URL链接: http://www.bursamalaysia.com/market/listed-companies/company-announcements/5927925

http://www.bursamalaysia.com/market/listed-companies/company-announcements/5927809

http://www.bursamalaysia.com/market/listed-companies/company-announcements/5927509

Public Sub GetInfo()
Dim IE As New InternetExplorer, clipboard As Object
With IE
    .Visible = False

    For u = 2 To 100

    .navigate Cells(u, 1).Value

    While .Busy Or .readyState < 4: DoEvents: Wend


    With .document.getElementById("bm_ann_detail_iframe").contentDocument
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 3) = .getElementsByClassName("formContentDataH")(3).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 4) = .getElementsByClassName("company_name")(0).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 5) = .getElementsByClassName("formContentDataH")(1).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 6) = .getElementsByClassName("formContentData")(3).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 7) = .getElementsByClassName("formContentData")(4).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 8) = .getElementsByClassName("formContentData")(5).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 9) = .getElementsByClassName("formContentData")(9).innerText

   End With
   Next u
End With
End Sub

1 个答案:

答案 0 :(得分:1)

我将建议一个简单的测试,即在单元格中有一个"http"字符串(以此为基础来使用URL)。我更喜欢IsEmpty测试。这是为了减轻在循环期间访问不存在的页面的尝试。您的错误似乎表明循环期间未找到框架。因此,可能性包括单元格中没有URL(从注释看来,这是一种可能性)或无效的URL /一个不符合预期模式的URL。

我通过使用On Error Resume Next语句处理后一种情况。您可能希望对特定的失败URL进行调试(如果存在),以检查是否在预期的情况下不存在iframe的情况,并确定是否需要进一步完善。

对于不同数量的网址,您可以像目前一样使用固定的结束循环,也可以动态确定最后一行,例如

Dim lastRow As Long
With ThisWorkbook.Worksheets("Sheet1")
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

然后从

循环
For u = 2 To lastRow

我仍然更喜欢Instr的{​​{1}}测试。

VBA:

"http"