python - 使用 BeautifulSoup 抓取特定的“跨度”类时遇到问题
问题描述
我正在从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)
我尝试了许多尝试更改类名、跨度名和使用 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 中有多个 span,因此您必须找到所有 span。我是这样做的:
stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).findAllNext('span')
stockQuote = stockQuote[1].text
findAllNext 函数将查找该 div 中的跨度。它返回大约 36,但您要查找的是第二个。然后,您只需像以前一样从中获取文本,它应该返回您要查找的数字。
虽然网络抓取是一个很好的工具,但可能值得研究一下 yahoo 的yfinance API。
推荐阅读
- postgis - 备份和恢复旧版 Geoserver 2.6
- c# - 带有 SignalR 的 ASP.Net MVC 中的 CORS 导致“Access-Control-Allow-Origin”错误
- time-complexity - if-else 语句的递归函数时间复杂度
- performance - Symfony 3.4 带有 docker 的低性能作曲家
- php-7.2 - 如何在 PHP 7.2 中更改计数函数以像 PHP 7.1 一样工作?
- reporting-services - 当数据集中没有行时字段与其他数据集值匹配时的 fitler 表禁用过滤器
- angular - 为 ngFor 编写自定义管道
- java - 如何在 JavaFX11 中替换 SkinBase 的继承
- laravel - 是否有任何功能可以从存储库设计模式中恢复软删除记录?
- c++ - 从 std::thread 调用 uv_async_send 不起作用