【问题标题】:VBA HTML Data Scrape GuidanceVBA HTML 数据抓取指南
【发布时间】:2016-10-04 05:05:18
【问题描述】:

我正在尝试使用 VBA 从以下站点提取数据,方法是输入一个城市,并将选定的结果输出到 Excel 单元格中。我对此很陌生,这是我的第三次尝试,但现在当我尝试运行它时出现“需要对象”错误。我已经完成了它,它当然会在我尝试创建的 IE 对象上引发错误。关于我可以做些什么来调整我的代码的任何建议?任何帮助将非常感激!谢谢你。

代码

Private Sub CreditUnion()

If Target.Row = Range("City").Row And Target.Column = Range("City").Column Then

    Dim IE As Object

    Set IE = CreateObject("internetexplorer.application")


    IE.Navigate "http://mapping.ncua.gov/SingleResult.aspx"
    IE.Visible = False

    Do While IE.Busy

        DoEvents

    Loop

    Set TableResults = IE.document.getElementsByID("MainContent_newDetails")

    Dim City As String: City = TableResults.Cells(17).innerHTML
    Dim CreditUnion As String: CreditUnion = TableResults.Cells(0).innerHTML
    Dim Region As String: Region = TableResults.Cells(9).innerHTML
    Dim Status As String: Status = TableResults.Cells(3).innerHTML
    Dim Assets As String: Assets = TableResults.Cells(13).innerHTML
    Dim Members As String: Members = TableResults.Cells(15).innerHTML


    Range("B1").Value = City
    Range("C4").Value = CreditUnion
    Range("D4").Value = Region
    Range("E4").Value = Status
    Range("F4").Value = Assets
    Range("G4").Value = Members


    IE.Quit
    Set IE = Nothing

End If

End Sub

代码无法超越这一点 [代码卡在这里][1]

我们越来越近了!成功通过了第一个屏幕。现在只是没有在案例陈述中提取数据 [在此处输入图片描述][2]

【问题讨论】:

  • @ForwardEd: 刮 :(

标签: html vba excel web-scraping


【解决方案1】:

我以纽约为例,代码如下。

我在 2016/6/7 重写

Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Sub CreditUnion()
    Dim IE As Object, TableResults As Object, webRow As Object, charterInfo As Variant, page As Long, pageTotal As Long, r As Long
    Dim beginTime As Date, i As Long

    Set IE = CreateObject("internetexplorer.application")
    IE.navigate "http://mapping.ncua.gov/ResearchCreditUnion.aspx"
    IE.Visible = True

    Do While IE.Busy Or IE.readystate <> 4   '4 = READYSTATE_COMPLETE 
        DoEvents
    Loop

    'input city name into form
    IE.document.getelementbyid("MainContent_txtCity").Value = "new york"
    'click find button
    IE.document.getelementbyid("MainContent_btnFind").Click
    sleep 5 * 1000

    'total pages
    pageTotal = IE.document.getelementbyid("MainContent_pager_total").innertext
    page = 0

    Do Until page = pageTotal
        DoEvents
        page = IE.document.getelementbyid("MainContent_pager_to").innertext
        With IE.document.getelementbyid("MainContent_grid")
            For r = 1 To .Rows.Length - 1
                If Not IsArray(charterInfo) Then
                    ReDim charterInfo(7, 0) As Variant
                Else
                    ReDim Preserve charterInfo(7, UBound(charterInfo, 2) + 1) As Variant
                End If

                charterInfo(0, UBound(charterInfo, 2)) = .Rows(r).Cells(0).innertext
            Next r
        End With

        If page < pageTotal Then
            IE.document.getelementbyid("MainContent_pageNext").Click
            beginTime = Now
            Application.Wait (Now + TimeValue("00:00:05"))
        End If
    Loop

    For r = 0 To UBound(charterInfo, 2)
        IE.navigate "http://mapping.ncua.gov/SingleResult.aspx?ID=" & charterInfo(0, r)
        Do While IE.Busy Or IE.readystate <> 4   '4 = READYSTATE_COMPLETE 
            DoEvents
        Loop
        'wait 5 sec. for screen refresh
        sleep 5 * 1000

        With IE.document.getelementbyid("MainContent_newDetails")
            For i = 0 To .Rows.Length - 1
                DoEvents
                Select Case .Rows(i).Cells(0).innertext
                Case "Credit Union Name:"
                    charterInfo(1, r) = .Rows(i).Cells(1).innertext
                Case "Region:"
                    charterInfo(2, r) = .Rows(i).Cells(1).innertext
                Case "Credit Union Status:"
                    charterInfo(3, r) = .Rows(i).Cells(1).innertext
                Case "Assets:"
                    charterInfo(4, r) = Replace(Replace(.Rows(i).Cells(1).innertext, ",", ""), "$", "")
                Case "Number of Members:"
                    charterInfo(5, r) = Replace(.Rows(i).Cells(1).innertext, ",", "")
                Case "Address:"
                    charterInfo(6, r) = .Rows(i).Cells(1).innertext
                Case "Phone:"
                    charterInfo(7, r) = "'" & .Rows(i).Cells(1).innertext
                End Select
            Next i
        End With
    Next r


    IE.Quit
    Set IE = Nothing

    'post result on Excel cell
    Worksheets(1).Range("A1").Resize(UBound(charterInfo, 2) + 1, UBound(charterInfo, 1) + 1).Value = Application.Transpose(charterInfo)
End Sub

【讨论】:

  • 非常感谢!我将对其进行更改以使其符合我的要求。我将通过它,希望当我们到达 ID 屏幕时会发生什么对我有意义。再次,非常感谢!
  • 不客气。你能给我点个赞吗?
  • @K.K.或接受我的回答。所以,我可以赢得声誉。
  • 非常感谢。我继续接受您的回答并投票赞成。还有一个问题:运行代码时出现对象错误。我单步执行它,它不会超过第一个 End With 语句,它应该将它推送到包含我想要的所有信息的下一页。有什么我需要注意的吗?另外,我可以将 City 指定为 excel 中的一个单元格,以便我输入一个单元格而不是代码吗?那是我的计划@pcw
  • 我更新了添加dim i as long的代码。我测试代码。它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2017-10-15
相关资源
最近更新 更多