【问题标题】:VBA HTML Adressing with .getElements使用 .getElements 进行 VBA HTML 寻址
【发布时间】:2020-02-18 15:14:00
【问题描述】:

我有以下 HTML

我正在尝试获取突出显示的日期。

这是我的代码,但它不起作用。我明白了

“对象不支持此属性或方法”:

Set sammel = HTMLDoc.getElementsByClassName("date").innerText

这是完整的代码

Sub testalt()

Dim HTMLInput As MSHTML.IHTMLElement
Dim HTMLInput2 As MSHTML.IHTMLElement
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLButtons As MSHTML.IHTMLElementCollection
Dim ie As InternetExplorerMedium
Dim buttonsubmit As HTMLButtonElement
Dim sammel As String

Set ie = New InternetExplorerMedium
ie.Visible = True
ie.navigate "https://plm.corp.int/&showInitialResults=true&cancelLabel=Close&minRequiredChars=3&genericDelete=true&selection=multiple&txtTextSearch=e2711846&filters={%27txtTextSearch%27:[%27Equals|e2711846%27]}
Do While ie.readyState <> READYSTATE_COMPLETE
Loop

'Seite öffnen und Wert in Suche geben
Set HTMLDoc = ie.document
Set HTMLInput = HTMLDoc.getElementById("txtTextSearch")
Set HTMLInput2 = HTMLDoc.getElementById("mx_btn-search")
HTMLInput.Value = "e2711846"
HTMLInput.FireEvent ("onkeyup")
HTMLInput2.Click

''Nach neuester Version suchen

sammel = HTMLDoc.getElementsByClassName("date")(0).innerText

End Sub

sammel 仍然是空的。我的页面不刷新或其他什么问题?因为我打开一个搜索窗口,然后输入搜索词并搜索它。但 URL 在新打开的窗口中保持不变。我认为这是一个 javascript 的东西

【问题讨论】:

  • 检查Debug.Print HTMLDoc.getElementsByClassName("date").Length,如果它为零,这意味着没有找到名为dateclass。为什么你使用InternetExplorerMedium 而不是InternetExplorer?检查这是否也有效。
  • 关于 InternetexplorerMedium。如果我不使用它,我会得到运行时错误 462。Debugprint 给我“0”
  • 零表示getElementsByClassName("date") 没有找到任何东西。由于您的 URL 不公开,因此我们只能说,我们无法重现您的问题。因此,您可能需要进行更多调查以提供更多详细信息或自行查找问题。
  • 会不会是当你做HTMLInput2.Click时,浏览器会加载一个新的网页?诸如搜索结果或有关产品的信息等。如果为 true,则意味着源代码已更改,并且您的变量 HTMLDoc 仍链接到 first 网页。所以你需要重复这个过程(链接到新加载的网页,并在源代码中获取元素)
  • 尝试在HTMLInput2.Click 之后等待,直到ie.readyStateREADYSTATE_COMPLETE,使用你在开始时所做的循环。也许它需要一些时间来加载一些东西,而 HTML 代码还没有准备好。

标签: html excel vba web-scraping


【解决方案1】:

可以存在多个具有class="date" 的 HTML 标记,因此HTMLDoc.getElementsByClassName("date") 是这些元素的数组。

如果您假设有多个带有class="date" 的元素,您需要遍历它们。或者您可以使用以下方法获取第一个:

Dim sammel As Object
Set sammel = HTMLDoc.getElementsByClassName("date")(0)
Debug.Print sammel.innerText

请注意,您只能Set 一个对象,但innerText 返回一个字符串(文本)。所以要么像上面那样,要么没有Set

Dim sammel As String
sammel = HTMLDoc.getElementsByClassName("date")(0).innerText

【讨论】:

  • 只是想知道,但如果innertext返回一个字符串,为什么Set
  • @FoxfireAndBurnsAndBurns OMG,我错过了。感谢您指出。我改进了我的答案。
  • @匿名投票者不发表评论:非常有用!
  • 谢谢各位。明天我会试一试,然后报告
  • 不幸的是,我仍然收到错误消息。对象变量或未设置块变量
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2012-04-30
  • 2011-12-24
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多