我正在做一个股票检查器,当我在finance.yahoo.com上访问亚马逊(AMZN(时,我遇到了一些问题。我的代码运行得很好,但当我尝试特斯拉(TSLA(时,它不起作用。这是我代码的一部分。
getperstock = driver.find_element_by_xpath('//*[@class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"]').text #Works
print(str(getperstock))
#"Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($negativeColor)"
getstockratio = driver.find_element_by_xpath('//*[@class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($positiveColor)"]').text #Doesnt
print(str(getstockratio))
以下是最小的HTML
<div class="D(ib) Mend(20px)" data-reactid="31">
<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"
data-reactid="32">670.97</span>
<span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($negativeColor)"
data-reactid="33">-20.65 (-2.99%)</span>
<div id="quote-market-notice" class="C($tertiaryColor) D(b) Fz(12px) Fw(n) Mstart(0)--mobpsm Mt(6px)--mobpsm"
data-reactid="34">
<span data-reactid="35">At close: 4:00PM EDT</span>
</div>
</div>
你得到第一个span
的第一个xpath是可以的。但第二个span
将包括negative
或positive
,所以如果股票是负/正的,它将无法定位元素。我看到你在评论中说它有效,但我相信一旦它走上相反的道路,它就会失败。
更好的方法:
# get parent of both `span`
parent = driver.find_element_by_xpath('//div[@class="D(ib) Mend(20px)"]')
# get the `span` insides
span_elems = parent.find_elements_by_tag_name("span")
# first one is the stock price
price = span_elems[0].text
# second span is the %
ratio = span_elems[1].text
# third one is the "at close..." but you dont need it
顺便说一句,不要使用find_elements...
来查找父节点。使用显式等待将使代码有效地为您完成等待部分:https://selenium-python.readthedocs.io/waits.html