无法在两个子节点之间重用相同的驱动程序

问题描述 投票:1回答:1

我使用selenium创建了一个宏来获取网站上不同帖子的链接,并在导航到目标页面后解析每个帖子的标题。我的第一个例子正是按照预期的那样使用单个sub编写的。

我想使用两个sub来修改我的宏,并在两个sub之间重用相同的驱动程序,就像我在第二个例子中尝试过的那样。

工作一个(使用单个子):

Sub FetchLinks()
    Const link$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim driver As New ChromeDriver, post As Object
    Dim itmLink As Variant, R&, iDic As Object
    Set iDic = CreateObject("Scripting.Dictionary")

    With driver
        .get link
        For Each post In .FindElementsByCss(".summary .question-hyperlink", timeout:=10000)
            iDic(post.Attribute("href")) = 1
        Next post

        For Each itmLink In iDic.keys
            driver.get itmLink
            Debug.Print .FindElementByCss("h1 > a.question-hyperlink").Text
        Next itmLink
    End With
End Sub

无法使其工作(尝试在另一个子域中传递驱动程序以便重用它):

Sub FetchLinks()
    Const link$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim driver As New ChromeDriver, post As Object

    With driver
        .get link
        For Each post In .FindElementsByCss(".summary .question-hyperlink", timeout:=10000)
            FetchData driver, post.Attribute("href")
        Next post
    End With
End Sub

Sub FetchData(ByRef driver, ByRef nlink As String)
    Dim elem As Object

    With driver
        .get nlink
        Debug.Print .FindElementByCss("h1 > a.question-hyperlink").Text
    End With
End Sub

我如何在两个潜艇之间共享chromedriver以便从内页中抓取一些内容?

vba selenium web-scraping
1个回答
1
投票

您将获得一个陈旧的元素引用,就像您在离开着陆页时导航的内部子元素一样。然后尝试继续在外部循环中引用此页面。将链接放入字典并循环。另外,通过ByVal

Option Explicit

Public Sub FetchLinks()
    Const link$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim driver As ChromeDriver, post As Object, key As Variant
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary"): Set driver = New ChromeDriver
    With driver
        .get link

        For Each post In .FindElementsByCss(".summary .question-hyperlink", timeOut:=10000)
            dict(post.Attribute("href")) = 1
        Next
        For Each key In dict.keys
            FetchData driver, key
        Next key
    End With
End Sub

Public Sub FetchData(ByVal driver As ChromeDriver, ByVal nlink As String)
    With driver
        .get nlink
        Debug.Print .FindElementByCss("h1 > a.question-hyperlink").Text
    End With
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.