Excel VBA:从在线HTML表格获取内容

3

请问有人能为我展示一部分VBA代码吗?该代码将从此在线HTML表格中获取文本“hello”。第一个节点将通过其ID(id =“something”)找到。

...
<table id="something">
  <tr>
    <td><TABLE><TR><TD></TD></TR><TR><TD></TD></TR></TABLE></td><td></td>
  </tr>
  <tr>
    <td></td><td></td><td>hello</td>
  </tr>
...

我认为它会像 child->sibling->child->sibling->sibling->child 这样,但我不知道确切的方式。
编辑 更新后的代码标签是大写。所以如果我使用 getElemenetsById("something").getElemenetsByTagName('tr') 它只会将两个 tr 标签收集起来,或者四个(包括更深层级的标签)?

1
为什么要减1?我认为这对于任何与此相关的人来说都是一个简单明了的问题。 - koubin
我确定这个问题以前已经被问过了,我很确定我曾经评论或者回答过它...只是找不到它了。 - NickSlash
1
@NickSlash 首先,如果你回答过问题,你可以在你的个人资料中看到它。其次,在我提出问题之前,我尝试通过检查输入问题的链接来查找答案。但是没有找到相关的答案。我不明白为什么要给我打负分,如果你知道答案,那回答一下不是很简单吗? - koubin
1
我没有给你的问题打负分。 - NickSlash
2
@NickSlash 乍一看似乎如此。我道歉。 - koubin
2个回答

5
如果您正在寻找答案,下一次可能需要扩大范围。有很多与DOM和VBA有关的问题和答案。 使用HTMLElement的getElementById而不是HTMLDocument 虽然问题(和答案)不完全符合您的要求,但它将向您展示如何创建可用的东西。
您需要使用getElementById()getElemenetsByTagName()的混合来检索所需的“hello”
例如:Document.getElementById("something").getElementsByTagName("tr")(1).getElementsByTagName("td")(2).innerText
  • 获取元素“something”
  • 在“something”内获取所有的“tr”标签(特别是位于索引1的标签)
  • 在返回的tr标签内获取所有的“td”标签(特别是位于索引2的标签)
  • 获取上一个结果的innerText
这些对象使用0个基础数组,因此第一个项目是item(0)。 更新

document.getElementById()将返回一个(单数)IHTMLElement(其中包括所有子元素),如果不存在,则返回nothing/null。

document.getElementsByTagName()将返回IHTMLElement的集合(同样,每个元素都包括所有子元素)。 (如果不存在,则返回空集合)

document.getElementsByTagName("tr")这将返回“文档”元素内的所有tr元素。

document.getElementsByTagName("tr")(0)将返回集合中的第一个(单数)IHTMLElement。 (注意末尾的索引?)

我在VBA中没有找到InternetExplorer对象的“同级”功能,因此您必须使用子索引手动执行它。

使用DOM函数清晰的方法。 它比仅查看链“Element.Children(0)。children(1)。children(2)”要清晰得多,因为您不知道索引的含义,除非手动查找它。


好的,谢谢。我会尝试,但我认为必须有更直接的方法来获取DOM树中的元素。就像你发送的其他StackOverflow问题中的那样(Element.Children(1).Children(0).innerText)。在这个例子中,我看不到类似"getElementsByTagName("td")(2)"的东西,所以即使我找到它,我仍然不知道答案。 - koubin
问题的答案使用了类似那样的方式,而 IHTMLElement 对象确实支持 children 属性。请阅读 MSDN 上的文档。至于更简单的方法,我不确定你的意思。没有什么魔法般的捷径可以做到这一点。 - NickSlash
所以我尝试了。问题是,表格单元格<td>可以包含全新的表格。因此,如果我使用getElementById("something").getElementsByTagName("tr")(2),它会收集“something”元素下的所有TR(对吗?)。那么我将从基本表的第一行中包含的表的第一行中获取第一行。这就是为什么我询问像children->sibling这样的干净方法的原因... - koubin
我写的有点困惑,抱歉。这句话“它收集了所有在'something'元素下的TR(对吗?)”应该听起来像“它收集了所有在'something'元素下的TR,包括嵌套表中的TR,并选择其中的第三个(对吗?)”。我已经更新了我的问题示例,所以现在描述情况更清楚了,也许 :-) 嵌套表是我正在寻找兄弟特性的原因(如果它像我更新后的问题那样工作)。 - koubin
是的,它将获取您嵌套表中的所有tr元素。再次强调,我不认为VBA实现包括兄弟和下一个子节点等功能。您需要循环遍历getElementsByTagName的结果,并确保其父节点是顶级表格。 - NickSlash

1
我也曾四处寻找这个问题的答案。最终,通过与同事录制宏的方式,我找到了解决方案。我知道,你们可能认为自己比这高级,但实际上这是最好的方法。在此处查看完整文章http://automatic-office.com/?p=344。简而言之,您需要记录宏并转到数据-->从网页中,并导航到您的网站并选择所需的表格。过去,我使用了“按ID获取元素”之类的解决方案,对于一些元素来说是很好的,但如果您想要整个表格,并且您不是超级有经验的,只需记录宏即可。不要告诉你的朋友,然后重新格式化它,使其看起来像是你自己的工作,这样没有人会知道你使用了宏工具;)

谢谢您的评论。我一直在寻找像子/兄弟这样的更多编程方式,但了解其他解决方案也很好。 - koubin
它实际上也非常高效,所以我认为你不可能想出更好的东西。 - Rrgg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接