gpt4 book ai didi

html - 使用 VBA 访问 iframe 中的对象

转载 作者:太空狗 更新时间:2023-10-29 13:45:15 25 4
gpt4 key购买 nike

重点:

我已成功使用 VBA 执行以下操作:

  • 使用 getElementsByName 登录网站

  • 为将要生成的报告选择参数(使用 getelementsby...)

  • 在选择将结果数据集呈现到同一页面上的 iframe 中的参数后生成报告

重要提示 - 该网站是客户端

上面是简单的部分,下面是困难的部分:

clicking on a gif image within the iframe that exports the dataset to a csv

我尝试了以下方法:

Dim idoc As HTMLDocument
Dim iframe As HTMLFrameElement
Dim iframe2 As HTMLDocument

Set idoc = objIE.document
Set iframe = idoc.all("iframename")
Set iframe2 = iframe.contentDocument

Do Until InStr(1, objIE.document.all("iframename").contentDocument.innerHTML, "img.gif", vbTextCompare) = 0
DoEvents
Loop

为上面的逻辑提供一些上下文-

  • 我访问了主框架
  • 我通过名称元素访问了 iframe
  • 我访问了 iframe 中的内容
  • 我试图找到需要点击导出到 csv 的 gif 图片

正是在这一行,它出错了,说“对象不支持这个属性或方法”

还尝试通过 a 元素和 href 属性访问 iframe gif,但这完全失败了。我还尝试从其源 URL 抓取图像,但所有这些都将我带到了图像的来源页面。

注意:iframe 没有 ID,奇怪的是 gif 图像没有“onclick”元素/事件

Final consideration - attempted scraping the iframe using R

访问 iframe 的 HTML 节点很简单,但是尝试访问 iframe 的属性以及随后的表节点被证明是不成功的。它返回的只是“Character(0)”

library(rvest)
library(magrittr)

Blah <-read_html("web address redacted") %>%
html_nodes("#iframe")%>%
html_nodes("#img")%>%
html_attr("#src")%>%
#read_html()%>%
head()
Blah

一旦我包含 read_html,脚本就会返回以下错误:

if (grepl("<|>", x)) { 错误:参数长度为零

我怀疑这是指 Character(0)

感谢此处的任何指导!

非常感谢,

HTML

<div align="center"> 
<table id="table1" style="border-collapse: collapse" width="700" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<td colspan="6"> &nbsp;</td>
</tr>
<tr>
<td colspan="6">
<a href="href redacted">
<img src="img.gif" width="38" height="38" border="0" align="right">
</a>
<strong>x - </strong>
</td>
</tr>
</tbody>
</table>
</div>

最佳答案

iframe 有时会很棘手。我根据您提供的 html 创建了这个示例。哪个适用于本地,但它也适用于您吗?

要获取 IFrame,可以使用 frames 集合。希望您知道 IFrame名称

Dim iframeDoc As MSHTML.HTMLDocument
Set iframeDoc = doc.frames("iframename").document

然后去 image 我们可以使用 querySelector 方法,例如像这样:

Dim img As MSHTML.HTMLImg
Set img = iframeDoc.querySelector("div table[id='table1'] tbody tr td a[href^='https://stackoverflow.com'] img")

选择器 a[href^='https://stackoverflow.com'] 选择具有 href 属性的 anchor 开始与给定的文本。 The ^ denotes the beginning .

然后,当我们有了图像时,只需简单地调用 click 它的父级即可,这是所需的 anchor


完整示例:

Option Explicit

' Add reference to Microsoft Internet Controls (SHDocVw)
' Add reference to Microsoft HTML Object Library

Sub Demo()

Dim ie As SHDocVw.InternetExplorer
Dim doc As MSHTML.HTMLDocument
Dim url As String

url = "file:///C:/Users/dusek/Documents/My Web Sites/mainpage.html"
Set ie = New SHDocVw.InternetExplorer
ie.Visible = True
ie.navigate url

While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
DoEvents
Wend

Set doc = ie.document

Dim iframeDoc As MSHTML.HTMLDocument
Set iframeDoc = doc.frames("iframename").document
If iframeDoc Is Nothing Then
MsgBox "IFrame with name 'iframename' was not found."
ie.Quit
Exit Sub
End If

Dim img As MSHTML.HTMLImg
Set img = iframeDoc.querySelector("div table[id='table1'] tbody tr td a[href^='https://stackoverflow.com'] img")
If img Is Nothing Then
MsgBox "Image element within iframe was not found."
ie.Quit
Exit Sub
Else
img.parentElement.Click
End If

ie.Quit
End Sub

Main page HTML used

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<!-- saved from url=(0016)http://localhost -->
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>x -</title>
</head>

<body>
<iframe name="iframename" src="iframe1.html">
</iframe>
</body>

</html>

IFrame HTML used (saved as file iframe1.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<!-- saved from url=(0016)http://localhost -->
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 2</title>
</head>

<body>
<div align="center">
<table id="table1" style="border-collapse: collapse" width="700" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<td colspan="6"> &nbsp;</td>
</tr>
<tr>
<td colspan="6">
<a href="https://stackoverflow.com/questions/44902558/accessing-object-in-iframe-using-vba">
<img src="img.gif" width="38" height="38" border="0" align="right">
</a>
<strong>x - </strong>
</td>
</tr>
</tbody>
</table>
</div>

</body>

</html>

BTW, The frame may be referenced by it's index also doc.frames(0).document. Thanks to Paulo Bueno.

关于html - 使用 VBA 访问 iframe 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44902558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com