excel - 如何在id下获取html的内部文本?
问题描述
我正在尝试在 excel 单元格中的 id 下提取数据拉内部文本。
这是针对 XML 代码的。
Sub getelementbyid()
Dim XMLpage As New MSXML2.XMLHTTP60
Dim hdoc As New MSHTML.HTMLDocument
Dim HBEs As MSHTML.IHTMLElementCollection
Dim HBE As MSHTML.IHTMLElement
Dim ha As String
XMLpage.Open "GET","https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuote.jsp?symbol=HAL", False
XMLpage.send
hdoc.body.innerHTML = XMLpage.responseText
ha = hdoc.getelementbyid("open").innerText
Range("K11").Value = ha
Debug.Print ha
End Sub
我期望输出值,但它显示--。
解决方案
检查响应文本。页面在浏览器中的呈现方式与在 ResponseText 中返回的方式有所不同。
我将 URL 放入浏览器进入开发工具 (F12),找到该元素,并记下 HTML 元素内的数值。
然后我将我们在 VBA 中获得的响应文本转储到一个单元格中,并将整个单元格值复制到 Notepad++ 中。如果你这样做,你会看到#open 元素内的初始值确实是“--”。
真正的价值似乎是通过 JavaScript 写入 HTML,这是常见的做法。页面顶部有一个 JSON 对象,大概是根据您的请求从网站后端注入到文档中的。
所以你必须解析 JSON,而不是 HTML。我已经提供了这样做的代码。现在,可能有更好的方法来做到这一点,我觉得这段代码有点“hacky”,但它可以为您的示例 URL 完成工作。
Sub getelementbyid()
Dim XMLpage As New MSXML2.XMLHTTP60
Dim hdoc As New MSHTML.HTMLDocument
Dim HBEs As MSHTML.IHTMLElementCollection
Dim HBE As MSHTML.IHTMLElement
Dim ha As String
XMLpage.Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuote.jsp?symbol=HAL", False
XMLpage.send
'// sample: ,"open":"681.05",
Dim token As String
token = """open"":"""
Dim startPosition As Integer
startPosition = InStr(1, XMLpage.responseText, token)
Dim endPosition As Integer
endPosition = InStr(startPosition, XMLpage.responseText, ",")
Dim prop As String
prop = Mid(XMLpage.responseText, startPosition, endPosition - startPosition)
prop = Replace(prop, """", vbNullString)
prop = Replace(prop, "open:", vbNullString)
Dim val As Double
val = CDbl(prop)
ha = val
Range("K11").Value = ha
Debug.Print ha
End Sub
推荐阅读
- python - 动态定义类的 __init__ 参数(使用先前定义的字典)
- github - 如何在 travis 中克隆需要 VPN 访问的 github 企业存储库?
- angular - 检查 rxjs 中是否存在交易
- python - 避免嵌套循环或列表理解
- r - R - 函数等于函数
- r - 如何查看 R 脚本中正在使用哪些包,以及当前未使用哪些包?
- c# - 我无法从文本框 HttpRequest c# 发送文本
- python - 数据表从日期列分配月份
- python - ValueError: no enough values to unpack (expected 2, got 1) again
- javascript - 从多个服务器连接到 prisma