VBA Excel运行时错误438 / getElementbyClassName

时间:2018-09-25 16:56:21

标签: html excel vba web-scraping getelementsbytagname

我是新手,正在尝试从imdb.com网站上抓取宽高比详细信息。
我在You Tube上掠夺了一些代码,并使用inspect元素对其进行了修改。 该代码打开imdb并按标题运行搜索,但返回运行时错误438。 理想情况下,我希望它返回最上面的结果的html,以便我可以进一步单击最上面的结果,以浏览到具有技术细节的页面,从那里我可以获取长宽比信息并将其粘贴到单元格中。 / p>

不幸的是,我的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

2 个答案:

答案 0 :(得分: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查询的第一个结果:

enter image description here

这是具有基本字符串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

答案 1 :(得分:0)

这行代码:

Foo*

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

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

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

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