VBAExcel运行时间错误438/getElementsbyClassName

VBA Excel Run time error 438 / getElementbyClassName

我是新手,正在尝试从 imdb.com 网站抓取纵横比详细信息。
我在 You Tube 上搜集了一些代码并使用 inspect element 对其进行了修改。 该代码打开 imdb 并按标题运行搜索,但 return 出现 运行 时间错误 438。 理想情况下,我希望它成为顶部结果的 return 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

所以,解决您的代码

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

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

我使用 .result_text a 的 CSS 选择器组合来定位带有标签 a 的父 class result_text 中的元素。 .class selector.

这种组合称为 descendant selector

使用 Red October 的 sheet 中的搜索词,这就是 CSS 查询的第一个结果:

它是一个相对 link 与基本字符串 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

这行代码:

doc.getElementsByTagName("a")

在您的 HTML 文档中为您提供 超链接集合 。也就是说,它会为您提供符合给定条件的所有元素(如果有的话)。 但是,可能会出现一些问题:

  1. 可能没有任何可用的超链接 - 因此没有可单击的元素。

  2. 您没有引用任何要单击的元素。如果您想要找到的项目集合中的第一个,您可以按照建议使用索引。否则,您可能会寻找其他点击条件(例如其文本或其他给定属性)。

  3. 即便如此,您的浏览器也可能无法点击找到的元素,例如,如果它被另一个元素遮挡。