[英]Trouble scraping a specific 'span' class using BeautifulSoup
我正在从https://ca.finance.yahoo.com/quote/AAPL 抓取并希望获得股票价格的变化,文本为绿色/红色。 由于它们位于相同的“div”class 但不同的“span”class 中,因此我能够获取股价但不能获取变化值。
我想要的文本:'-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)
我尝试了许多尝试更改 class 名称、跨度名称和使用 data-reactid 但似乎都不起作用的变体,它们都是 output 一个空的“[]”。
非常感谢您。
看起来问题出在这一行
stockQuote = page_soup.find('div', {'class': 'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text
class 名称应该用空格分隔,因为它们在 html 中是不同的 class。
解决方案是将它们分开,如您在 HTML 页面中看到的那样。 它看起来像这样(在 class 标识符中添加了两个空格):
stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).find('span').text
但是,这将返回红色/绿色文本之前的数字。 由于此 div 中有多个 span,因此您必须找到所有 span。 我是这样做的:
stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).findAllNext('span')
stockQuote = stockQuote[1].text
findAllNext function 将在该 div 中找到跨度。 它返回大约 36,但您要查找的是第二个。 然后,您只需像以前一样从中获取文本,它应该返回您要查找的数字。
虽然 web 抓取是一个不错的工具,但可能值得研究一下 yahoo 的yfinance API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.