【问题标题】:Get value using getElementsbyClassName使用 getElementsbyClassName 获取值
【发布时间】:2022-01-10 19:04:33
【问题描述】:

我一直在使用此函数从 Yahoo! 获取股票价格的价值财务:

html.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)").Item(0).innerText

我使用的网站是(例如股票代码 IQ):https://finance.yahoo.com/quote/?p=IQ

但是最近,可能是由于升级,这个类抛出了一个错误。运行 html 变量我发现现在它被重命名为:("Fw(b) Fz(36px) Mb(-4px) D(ib)")

我这里有全文,我只想知道如何从这个元素中获取ticker的值。

    <DIV class="D(ib) Mend(20px)" data-reactid="52">
        <FIN-STREAMER class="Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="53" active="" value="4.71" data-trend="none" data-field="regularMarketPrice" data-symbol="IQ" data-test="qsp-price" data-pricehint="4">
            4.7100
        </FIN-STREAMER>
        <FIN-STREAMER class="Fw(500) Pstart(8px) Fz(24px)" data-reactid="54" active="" value="-0.8800001" data-trend="txt" data-field="regularMarketChange" data-symbol="IQ" data-test="qsp-price-change" data-pricehint="4">
            <SPAN class=C($negativeColor)>-0.8800</SPAN>
        </FIN-STREAMER>
        <!-- react-text: 55 -->
        <!-- /react-text -->
        <FIN-STREAMER class="Fw(500) Pstart(8px) Fz(24px)" data-reactid="56" active="" value="-0.15742399" data-trend="txt" data-field="regularMarketChangePercent" data-symbol="IQ" data-template="({fmt})" data-pricehint="4">
            <SPAN class=C($negativeColor)>(-15.74%)</SPAN>
        </FIN-STREAMER>
        <FIN-STREAMER class=D(n) data-reactid="57" active="true" value="" data-trend="none" data-field="regularMarketTime" data-symbol="IQ" changeev="regularTimeChange">
        </FIN-STREAMER>
        <FIN-STREAMER class=D(n) data-reactid="58" active="true" value="" data-trend="none" data-field="marketState" data-symbol="IQ" changeev="marketState">
        </FIN-STREAMER>

我想得到的值是4.7100。

我使用的是:

html.getElementsByClassName("Fw(b) Fz(36px) Mb(-4px) D(ib)").Item(0).innerText

但这会返回一个空结果。

【问题讨论】:

  • 考虑改用querySelectorAll,并用.字符替换空格,这样类列表中类名的实际顺序不会破坏你的程序。
  • 更好的主意:使用其他属性进行选择,例如querySelectorAll( 'IN-STREAMER[data-symbol="IQ"i][data-test-="qsp-price"i]' )i 部分使其成为不区分大小写的匹配项)。
  • 很确定 vba 不支持 i
  • 请注意,该网站专门设计用于更改内容以抵抗抓取。如果您需要财务数据,请从 API 中获取,这样会更容易且不易损坏

标签: html vba ms-access


【解决方案1】:

远离动态类,因为它们容易中断,而是在元素之间寻找稳定的属性/关系。我会有以下内容:

html.querySelector("#quote-header-info [data-field=regularMarketPrice]").innerText

这使用 id quote-header-info 来锚定父级,将以下选择器中的匹配项减少到一个。 [data-field=regularMarketPrice] 之前的空格是后代组合符,指定后面是 DOM 中的后代元素。 [data-field=regularMarketPrice] 是一个属性 = 值 css 选择器,通过其 data-field 属性和关联值来定位所需节点。

【讨论】:

  • 非常感谢。抱歉,但我是这方面的初学者,我继续尝试您的代码,但没有任何效果。我不知道你是用伪写的还是这正是我必须尝试的。如果你能提供一个很有帮助的例子。再次感谢您的宝贵时间。
  • 你需要用它做一些事情,例如debug.print 它,或将其分配给一个单元格或msgbox 它。您是如何将上面的行合并到您的代码中的?例如。 Range("B2") = html.querySelector("#quote-header-info [data-field=regularMarketPrice]").innerText
  • 感谢您的回复。它在 ACCESS 上,所以基本上是将它保存到一个变量中:stockprice = html.querySelector("#quote-header-info [data-field=regularMarketPrice]").innerText 我也尝试过debug.print,它返回为空。
  • 您检查过 1) 响应状态 2) 响应文本是否有任何信息?您可能会收到意想不到的回复。另外,您是使用浏览器自动化还是 xmlhttp 请求?如果是后者,请务必在请求中添加用户代理标头。
  • 使用 XMLHTTP:Set request = CreateObject("MSXML2.XMLHTTP") 我确实检查了响应文本,并且有很多可以解析的文本。作为临时修复,我使用以下代码:html.getElementsByClassName("D(ib) Mend(20px)").Item(1).innerText 来获取一堆东西。这让我得到了价格、增加或减少、时间等。然后我使用逻辑解析它,只得到股票价格。但这是一种非常创可贴(临时)的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多