首页 > 解决方案 > VBA Excel 运行时错误 438 / getElementbyClassName

问题描述

我是一个新手,试图从 imdb.com 网站上抓取纵横比的详细信息。
我在 You Tube 上掠夺了一些代码,并使用检查元素对其进行了调整。该代码打开 imdb 并按标题运行搜索,但返回运行时错误 438。理想情况下,我希望它返回顶部结果的 html,以便我可以进一步单击顶部结果以跟随技术页面我可以从中获取纵横比信息并将其粘贴到单元格中的详细信息。

不幸的是,我的 Click 指令失败了——甚至还没有到提取纵横比信息的地步。

谁能看到我哪里出错了?

非常感谢,

缺口

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Row = Range("Title").Row And Target.Column = Range("Title").Column Then
    Dim ie As New InternetExplorer
    ie.Visible = True
    ie.navigate "https://www.imdb.com/find?ref_=nv_sr_fn&q=" & Range("Title").Value
    Do
     DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE
    Dim doc As HTMLDocument
    Set doc = ie.document
    Dim sDD As String
    doc.getElementsByTagName("a").Click
  End If
End Sub

标签: htmlexcelvbaweb-scrapinggetelementsbytagname

解决方案


所以,解决你的代码

  1. 您可以使用较短的版本Target.Address = Range("Title").Address
  2. 您不想要第一个a标签元素。您需要第一个搜索结果a标签元素。

您可以使用 CSS 选择器组合来获取第一个搜索结果a标签元素,如下所示。

我使用 CSS 选择器组合来定位带有 tag.result_text a的父类中的元素。这是一个类选择器result_texta.

这种组合称为后代选择器

在这张表中使用搜索词Red October是 CSS 查询的第一个结果:

在此处输入图像描述

它是与基本字符串的相对链接https://www.imdb.com

通过querySelector方法应用意味着只返回第一个匹配的结果,即最上面的结果。


VBA:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  If Target.Address = Range("Title").Address Then
    Dim ie As New InternetExplorer
    ie.Visible = True
    ie.navigate "https://www.imdb.com/find?ref_=nv_sr_fn&q=" & Range("Title").value
    Do
     DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE
    Dim doc As HTMLDocument
    Set doc = ie.document
    doc.querySelector(".result_text a").Click
    'other code
  End If
  Application.EnableEvents = True
End Sub

推荐阅读