【问题标题】:VBA Excel Run time error 438 / getElementbyClassNameVBA Excel 运行时错误 438 / getElementbyClassName
【发布时间】:2019-03-01 09:07:03
【问题描述】:

我是新手,正在尝试从 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

【问题讨论】:

  • 您只能单击集合的单个成员 - 而不是整个集合。例如。 doc.getElementsByTagName("a")(0).Click
  • 您能否举例说明 Range("Title") 中的内容以及预期结果?
  • 范围标题将是电影标题。

标签: html excel vba web-scraping getelementsbytagname


【解决方案1】:

所以,解决您的代码

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

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

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

这种组合称为descendant selector

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

【讨论】:

  • 太棒了!正在查看 result_text 但尝试使用 innerText 的 getElementByClassName 并出现错误。明天将尝试这第一件事。 querySelector 方法!
  • 效果很好...我现在要花一些时间来了解原因!非常感谢 QHarr。
  • 如有任何问题,请告诉我。
  • 我将研究的位将是 Option Explicit 和 Application.EnableEvents=True
  • 啊...他们很容易。关于这些的大量文档。您应该始终使用 Option Explicit - 在 Tools >Options > Require variable declaration 下启用它。
【解决方案2】:

这行代码:

doc.getElementsByTagName("a")

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

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

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

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

【讨论】:

  • 谢谢 - 这是一个重要的教训,但通过所有标签似乎比非常有针对性的查询选择器更加多变和艰巨。非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多