【发布时间】:2022-09-30 23:14:09
【问题描述】:
我正在做一些练习来练习使用 Python 进行网络抓取,我想获取此 yahoo 页面表的第一行(“总收入”)的值:
https://finance.yahoo.com/quote/BAC/financials?p=BAC
查看页面源代码,我的想法是找到第一次出现的 <div class=\"\" data-test=\"fin-row\"> 并获取值,但我不确定如何在第一个 div 中导航。
下面我展示第一行的 HTML 代码:
<div class=\"\" data-test=\"fin-row\">
<div class=\"D(tbr) fi-row Bgc($hoverBgColor):h\">
<div class=\"D(tbc) Ta(start) Pend(15px)--mv2 Pend(10px) Bxz(bb) Py(8px) Bdends(s) Bdbs(s) Bdstarts(s) Bdstartw(1px) Bdbw(1px) Bdendw(1px) Bdc($seperatorColor) Pos(st) Start(0) Bgc($lv2BgColor) fi-row:h_Bgc($hoverBgColor) Pstart(15px)--mv2 Pstart(10px)\">
<div class=\"D(ib) Va(m) Ell Mt(-3px) W(215px)--mv2 W(200px) undefined\" title=\"Total Revenue\">
<button aria-label=\"Total Revenue\" class=\"P(0) M(0) Va(m) Bd(0) Fz(s) Mend(2px) tgglBtn\">
<svg class=\"H(16px) Fill($primaryColor) Stk($primaryColor) tgglBtn:h_Fill($linkColor) tgglBtn:h_Stk($linkColor) Cur(p)\" width=\"16\" style=\"stroke-width:0;vertical-align:bottom\" height=\"16\" viewBox=\"0 0 48 48\" data-icon=\"caret-right\">
<path d=\"M33.447 24.102L20.72 11.375c-.78-.78-2.048-.78-2.828 0-.78.78-.78 2.047 0 2.828l9.9 9.9-9.9 9.9c-.78.78-.78 2.047 0 2.827.78.78 2.047.78 2.828 0l12.727-12.728z\"></path>
</svg>
</button>
<span class=\"Va(m)\">Total Revenue</span>
</div>
<div class=\"W(3px) Pos(a) Start(100%) T(0) H(100%) Bg($pfColumnFakeShadowGradient) Pe(n) Pend(5px)\"></div>
</div>
<div class=\"Ta(c) Py(6px) Bxz(bb) BdB Bdc($seperatorColor) Miw(120px) Miw(100px)--pnclg Bgc($lv1BgColor) fi-row:h_Bgc($hoverBgColor) D(tbc)\" data-test=\"fin-col\"><span>90,742,000</span></div>
<div class=\"Ta(c) Py(6px) Bxz(bb) BdB Bdc($seperatorColor) Miw(120px) Miw(100px)--pnclg D(tbc)\" data-test=\"fin-col\"><span>89,113,000</span></div>
<div class=\"Ta(c) Py(6px) Bxz(bb) BdB Bdc($seperatorColor) Miw(120px) Miw(100px)--pnclg Bgc($lv1BgColor) fi-row:h_Bgc($hoverBgColor) D(tbc)\" data-test=\"fin-col\"><span>85,528,000</span></div>
<div class=\"Ta(c) Py(6px) Bxz(bb) BdB Bdc($seperatorColor) Miw(120px) Miw(100px)--pnclg D(tbc)\" data-test=\"fin-col\"><span>91,244,000</span></div>
<div class=\"Ta(c) Py(6px) Bxz(bb) BdB Bdc($seperatorColor) Miw(120px) Miw(100px)--pnclg Bgc($lv1BgColor) fi-row:h_Bgc($hoverBgColor) D(tbc)\" data-test=\"fin-col\"><span>91,247,000</span></div>
</div>
<div></div>
在我的代码中,我使用 Selenium 来处理页面。不确定这是否是最好的方法,但使用 urlopen 等其他库时,我无法看到 HTML 内容。我可以打开页面,单击接受按钮,但之后我不确定如何在第一个 div 中导航。我实际上得到了一个错误,如:\"AttributeError: \'NoneType\' object has no attribute \'get_text\"
import requests
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
url = \"https://finance.yahoo.com/quote/BAC/financials?p=BAC\"
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, \"html.parser\")
# Click accept button
aceitar = driver.find_element(By.NAME, \"agree\")
aceitar.click()
# Find the div of the Revenue row <div class=\"\" data-test=\"fin-row\">
primeiraLinha = soup.find(\"div\", {\"class\":\"\"})
print(primeiraLinha.get_text())
顺便说一句,我认为 Selenium 使这个过程非常缓慢。
标签: python web web-scraping