我正在浏览https://ca.finance.yahoo.com/quote/aapl并想要得到股票价格的变化,绿色/红色文本。我已经能够刮除股票价格,但不能改变价值,因为他们位于相同的“div”类,但不同的“span”类。
我想要的文本:“-3.89(-1.36%)”-数字会有所不同
来自网站得HTML:
<div class="My(6px) Pos(r) smartphone_Mt(6px)" data-reactid="29">
<div class="D(ib) Va(m) Maw(65%) Ov(h)" data-reactid="30">
<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">282.80</span>
<span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($negativeColor)"
data-reactid="33">-3.89 (-1.36%)</span>
我用什么得到的价格:(282.80)-价格可能不同
stockLink = ('https://ca.finance.yahoo.com/quote/AAPL')
stockPage = requests.get(stockLink)
stockSoup = BeautifulSoup(stockPage.text, 'lxml')
stockQuote = stockSoup.find('div', {'class':
'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text
print(stockQuote)
我已经尝试了许多改变类名、span名和使用data-reactid的变体,但似乎都不起作用,它们都输出一个空的“[]”。
非常感谢。
看来问题出在这一行
stockQuote = page_soup.find('div', {'class': 'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text
类名应该用空格分隔,因为它们在HTML中都是不同的类。
解决方案是将它们分开,就像您在页面HTML中看到的那样。它看起来像这样(类标识符中添加了两个空格):
stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).find('span').text
但是,这将返回红色/绿色文本之前的数字。由于在这个div中有多个跨度,您必须找到所有的跨度。我是这样做的:
stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).findAllNext('span')
stockQuote = stockQuote[1].text
findAllNext函数将查找该div中的跨度。它返回大约36,但你要找的是第二个。然后,您只需要从它获得文本,就像您以前做的那样,它应该返回您正在寻找的数字。
虽然web刮取是一个很好的工具,但它可能值得研究一下雅虎的yfinance API。