如何在使用iframe的网页上使用硒和vba查找表格?

时间:2019-04-12 14:41:57

标签: excel vba selenium iframe web-scraping

直到几天前,下面的代码都可以工作到URL,找到表并将表的内容导入Excel。然后,我进行了其他一些格式化,以将表放入适当的行和列中。但是现在此代码无法找到表。我不完全理解“ Set a = .FindElementsByTag(“ iframe”)(2)“和” .SwitchToFrame 1“。但是我的一般理解是,代码的这一部分切换到另一个框架,该框架然后提取内部url,然后将其用于从表中获取数据。

我需要帮助确定要进行哪些更改才能获得所需的“ url2”,即“ https://docs.google.com/spreadsheets/d/e/2PACX-1vT__QigQ9cJV03ohUkeK5dgQjfAbJqxrc68bXh9Is1WFST8wjxMxDy7hYUCFHynqRvInsANUI22GdIM/pubhtml?gid=817544912&single=true&chrome=false&widget=false&headers=false” url。 *注意:我不使用此docs.google网址,因为我不知道此网址是否会定期更改。我知道rosterresource.com/mlb-roster-grid网址会保持一致。

我尝试更改“ Set a = .FindElementsByTag(“ iframe”)(2)“和” .SwitchToFrame 1“的一些整数,但是由于我对这种艺术不熟悉,所以我盲目地这样做。代码。

Sub GetRRgrid()
    '"Selenium type library" is a reference used
    Dim d As WebDriver, a As Object
    Set d = New ChromeDriver
    Const url = "https://www.rosterresource.com/mlb-roster-grid/"

    With d
        .Start "Chrome"
        .Get url

        Set a = .FindElementsByTag("iframe")(2)

        .SwitchToFrame 1

        url2 = .FindElementByCss("iframe").Attribute("src")
        .Get url2
        ele = .FindElementByTag("tbody").Attribute("innerText")
        d.Close
    End With
    ' other processes t format the data after it is imported
end sub
````

2 个答案:

答案 0 :(得分:0)

获取iframe并切换到它:

您需要将iframe元素( identifier 参数)传递给SwitchToFrame,然后您才能进入该文档并可以与其内容进行交互。无需.get来使用Selenium。您必须切换到.SwitchToDefaultContent才能返回父文档。

您可以通过多种方式识别相关的iframe。现代浏览器针对CSS选择器进行了优化,因此我通常会使用它们。等于

的css
.FindElementByTag("iframe")

.FindElementByCss("iframe")

您的iframe是第一个(也是唯一一个),因此我不会费心收集一组webElement并将其编入索引。另外,您想尝试使用单个元素的简短选择器,以提高效率。


VBA:

Option Explicit
Public Sub Example()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Set d = New ChromeDriver

    With d
        .Start "Chrome"
        .get URL

        .SwitchToFrame .FindElementByCss("iframe")

        Stop

        .Quit
    End With
End Sub

写入Excel(.AsTable.ToExcel):

我只是发现了一种没有将文件记录到任何地方而感到兴奋的东西,那就是有一种方法可以将表直接写入Excel:

Option Explicit
Public Sub Example()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Set d = New ChromeDriver

    With d
        .Start "Chrome"
        .get URL

        .SwitchToFrame .FindElementByTag("iframe")
        .FindElementByCss(".waffle").AsTable.ToExcel ThisWorkbook.Worksheets("Sheet1").Range("A1")
        Stop

        .Quit
    End With
End Sub

答案 1 :(得分:0)

这就是我最后为这个问题所做的事情。感谢QHarr的指导。

Public Sub GetRRrostergrid()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Dim URL2 As String
    Set d = New ChromeDriver
    Sheet20.Activate

    With d
        .Start "Chrome"
        .Get URL
        URL2 = .FindElementByClass("post_content").FindElementByTag("iframe").Attribute("src")
        .Get URL2
        .FindElementByCss(".waffle").AsTable.ToExcel ThisWorkbook.Worksheets("RRchart").Range("b1")
        .Quit
    End With
End Sub