html - 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
解决方案
所以,解决你的代码
- 您可以使用较短的版本
Target.Address = Range("Title").Address
- 您不想要第一个
a
标签元素。您需要第一个搜索结果a
标签元素。
您可以使用 CSS 选择器组合来获取第一个搜索结果a
标签元素,如下所示。
我使用 CSS 选择器组合来定位带有 tag.result_text a
的父类中的元素。这是一个类选择器。result_text
a
.
这种组合称为后代选择器。
在这张表中使用搜索词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
推荐阅读
- google-apps-script - Google 应用程序脚本 - 基于不匹配的单元格设置边框格式以构建易于阅读的报告
- c++11 - Azure Devops 管道 - C++ - Whitesource Bolt
- terraform - 通过 Airflow 操作符运行 Terraform 命令
- azure - 使用 Azure CLI 获取 Kubernetes 负载均衡器的公网 IP
- elasticsearch - Elasticsearch - 为多个字段计算有多少记录具有特定字段值
- flutter - 使用flutter和firestore创建文档ID时如何存储文档ID
- javascript - Selenium Python - 将Javascript提取为字符串
- google-analytics - 气流连接构建凭据
- python - 使用 Python 库“请求”,我可以成功登录使用 JSEncrypt 函数作为 id 和 pw 的站点登录页面吗?
- java - 为什么(int i=0;我
关于二维数组的嵌套for循环,为什么应该是(int i=0;i<cars.length;i++),而不是(int i=0;i<=cars.length;i++)?
公共类主要{
public static void mai