【问题标题】:Error getbyclassname VBA Web Scraping from search engine来自搜索引擎的错误 getbyclassname VBA Web Scraping
【发布时间】:2018-09-28 02:17:45
【问题描述】:

在使用 getelementsbyClassName 时,我不断收到错误消息“对象不支持此属性或方法”。我想获取来自搜索引擎百度(Baidu.com)的网页的所有网址。但我无法“点击”搜索引擎的下一页。我已经尝试了几天,如果有人可以帮助我,那就太好了。谢谢!

Option Explicit

Public Sub GettingURL()

    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    Dim c As Long, u As Long
    c = 3
    Dim e
    Dim PageCount As Long

    With ie
        .Visible = False
        .navigate "http://www.baidu.com"

        'searching for the word on the search enigne
        While ie.Busy Or ie.readyState < 4: DoEvents: Wend
        .document.getElementsByTagName("INPUT")("wd").Value  = Sheets("Data").Cells(1, 2).Value
        .document.getElementById("su").Click

        'getting result for page 1 to 20
        For PageCount = 1 To 20

            'loop until the end to get resulting url and navigate to it
            Do
            Loop Until .readyState = READYSTATE_COMPLETE
            .navigate .document.URL

            'navigating page and this line causes problem:
            .document.GetelementByClassName("pc")(0) = PageCount

            'getting the url of all the search result in the result page
            While ie.Busy Or ie.readyState < 4: DoEvents: Wend
            With .document.querySelectorAll("#content_left h3 [href]")
                For u = 0 To 50
                    Sheets("Data").Cells(c, 1) = .Item(u)
                    c = c + 1
                Next
            End With

            PageCount = PageCount + 1
        Next

        .Quit
    End With

End Sub

【问题讨论】:

    标签: vba excel web-scraping


    【解决方案1】:

    错误消息的来源是方法中缺少"s"

    GetelementByClassName
    

    应该是getElementsByClassName,因为它返回一个集合。


    你可以点击下一步按钮

    ie.document.querySelector("a.n").Click
    

    a.n 是一个 CSS 选择器组合,用于类名为 na 标记元素。第一个匹配由querySelector 方法返回。

    你可以在这里看到目标元素:

    这里是 CSS 选择器:


    您可以使用以下方法遍历所有页面:

    Option Explicit
    Public Sub GettingURL()
        Dim i As Long
        With CreateObject("InternetExplorer.Application")
            .Visible = True
            .navigate "https://baidu.com/s?wd=Red"
            While .Busy Or .readyState < 4:  DoEvents:  Wend
    
            Dim aNodeList As Object: Set aNodeList = .document.querySelectorAll(".pc")
    
            For i = 1 To aNodeList.Length - 1
               aNodeList.item(i).Click
               While .Busy Or .readyState < 4:  DoEvents:  Wend
               Set aNodeList = .document.querySelectorAll(".pc")
            Next
            Stop '<== Delete me later
            .Quit
        End With
    End Sub
    

    【讨论】:

    • 以上内容你看懂了吗?
    • 感谢您的回复!但是,在进入下一页后, .navigate 似乎没有遵循新的 url。所以我无法转到第三页或从第二页获取信息。
    • 感谢您的帮助!我很乐意接受你的回答。但是,我仍然遇到一个问题,每次页面更改后如何导航到新的 URL?我需要导航到新的 URL,以便 .document.querySelectorAll("#content_left h3 [href]") 可用于从新页面中提取信息
    • 另外,在上面,您不需要导航。页面已经更新。 .document 每次都会刷新。在每个新页面中(每次单击后),由于文档已更改,因此我再次设置 Set aNodeList = .document.querySelectorAll(".pc") 。你看过代码运行吗?您将看到底部的页码发生变化。
    猜你喜欢
    • 2018-11-06
    • 2020-12-18
    • 2014-01-17
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多