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
所以,解决您的代码
- 您可以使用更短的
Target.Address = Range("Title").Address
- 您不需要第一个
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 文档中为您提供 超链接集合 。也就是说,它会为您提供符合给定条件的所有元素(如果有的话)。
但是,可能会出现一些问题:
可能没有任何可用的超链接 - 因此没有可单击的元素。
您没有引用任何要单击的元素。如果您想要找到的项目集合中的第一个,您可以按照建议使用索引。否则,您可能会寻找其他点击条件(例如其文本或其他给定属性)。
即便如此,您的浏览器也可能无法点击找到的元素,例如,如果它被另一个元素遮挡。
我是新手,正在尝试从 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
所以,解决您的代码
- 您可以使用更短的
Target.Address = Range("Title").Address
- 您不需要第一个
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 文档中为您提供 超链接集合 。也就是说,它会为您提供符合给定条件的所有元素(如果有的话)。 但是,可能会出现一些问题:
可能没有任何可用的超链接 - 因此没有可单击的元素。
您没有引用任何要单击的元素。如果您想要找到的项目集合中的第一个,您可以按照建议使用索引。否则,您可能会寻找其他点击条件(例如其文本或其他给定属性)。
即便如此,您的浏览器也可能无法点击找到的元素,例如,如果它被另一个元素遮挡。