使用外壳应用程序找到已经打开的IE窗口后,连接到数据

时间:2018-10-23 23:03:04

标签: vba excel-vba internet-explorer web-scraping

VBA code to interact with specific IE window that is already open

上面是使用VBA中的shell应用程序查找并转到已打开的IE实例的线程。找到所需的开放IE实例后,我需要从该IE页面中查询表而不使用其URL。我无法使用其URL的原因是,此IE页面是通用的“结果”页面,在主网站上进行搜索后会在单独的窗口中打开,因此,如果我使用结果页面的URL,即:{ {3}},它将返回错误。是否还有其他方法可以在不使用URL连接的情况下查询表,例如表的“ getElements”?

K.Davis,蒂姆·威廉姆斯:你的假设是正确的。我的代码/项目的第一部分打开了一个搜索页面:objIE.navigate“ https://a836-acris.nyc.gov/DS/DocumentSearch/BBLResult”并通过它提交搜索表单。第二部分(在第一段中已在上面概述)打开了结果页面(弹出窗口)。我正在尝试自动从该页面检索表。我尝试使用QueryTables.Add方法,这是我熟悉的连接到数据/网页的方式,需要URL。如果我使用结果页面中的URL,它将返回错误,因此我正在寻找有关如何进行连接的建议/帮助。那就是说我能够使用'getElements'方法检索页面的元素,但不能查询表。还有其他方法可以使用QueryTables.Add方法连接到数据源,请参见https://a836-acris.nyc.gov/DS/DocumentSearch/BBL,但我对这些其他方法并不熟悉。希望这可以澄清一点。

1 个答案:

答案 0 :(得分:0)

我没有遇到任何问题,因为尽管您有一个中间窗口,但最终的IE窗口解析为具有焦点的主要IE窗口。使用指定的搜索参数,我可以使用以下代码获取结果表:

Option Explicit
Public Sub GetInfo()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .navigate "https://a836-acris.nyc.gov/DS/DocumentSearch/BBL"

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

        With .document
            .querySelector("option[value='3']").Selected = True
            .querySelector("[name=edt_block]").Value = 1
            .querySelector("[name=edt_lot]").Value = "0000"
            .querySelector("[name=Submit2]").Click
        End With

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

        Dim hTable As HTMLTable

        Set hTable = .document.getElementsByTagName("table")(6)

        'do stuff with table

        .Quit
    End With
End Sub

您可以通过剪贴板复制表格。任何刻度线都会显示在正确的位置,但显示为空图标。

对于剪贴板早期绑定,请访问VBE>工具>参考> Microsoft-Forms 2.0对象库。

如果将UserForm添加到项目中,该库将自动添加。

Dim clipboard As DataObject
Set clipboard = New DataObject
clipboard.SetText hTable.outerHTML
clipboard.PutInClipboard
ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).PasteSpecial

后期使用

Dim clipboard As Object
Set clipboard =  GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")