我正在尝试使用下面的代码来抓取股票市值。起初我传统上尝试获取使用 bs4 的列表market cap values。当我以前 print(x.find('span',{'class': 'Trsdu(0.3s)'}).text)这样做时,我遇到了AttributeError: 'NoneType' object has no attribute 'text'错误。
for x in marketCapArray:
print(x.find('span',{'class': 'Trsdu(0.3s)'}).text)
我不知道如何解决特定于我的代码的上述错误。因此,我采取了另一种方法,使用正则表达式来简单地提取所需的值,并在下面进行了尝试。
主要代码
import bs4
import re
import requests
from bs4 import BeautifulSoup
from urllib.request import urlopen
def pickTopGainers():
url = 'https://in.finance.yahoo.com/gainers?offset=0&count=100'
page = urlopen(url)
soup = bs4.BeautifulSoup(page,"html.parser")
marketCapArray = soup.find_all('td', {'class': 'Va(m) Ta(end) Pstart(20px) Pend(10px) W(120px) Fz(s)',
'aria-label': 'Market cap'})
print(str(marketCapArray))
xi = re.findall("........</span>", str(marketCapArray)) # regex-use-1
pi = re.sub("(</span>|....>N/A|>|\")","", str(xi))
print(pi)
pickTopGainers()
结果
这就是print(str(marketCapArray)会输出的内容。(只粘贴了一部分)
[<td aria-label="Market cap" class="Va(m) Ta(end) Pstart(20px) Pend(10px) W(120px) Fz(s)" colspan="" data-reactid="93"><span class="Trsdu(0.3s)" data-reactid="94">159.404M</span></td>,
<td aria-label="Market cap" class="Va(m) Ta(end) Pstart(20px) Pend(10px) W(120px) Fz(s)" colspan="" data-reactid="119"><span class="Trsdu(0.3s)" data-reactid="120">533.97M</span></td>,
<td aria-label="Market cap" class="Va(m) Ta(end) Pstart(20px) Pend(10px) W(120px) Fz(s)" colspan="" data-reactid="145"><span data-reactid="146">N/A</span></td>,
<td aria-label="Market cap" class="Va(m) Ta(end) Pstart(20px) Pend(10px) W(120px) Fz(s)" colspan="" data-reactid="171"><span class="Trsdu(0.3s)" data-reactid="172">2.952B</span></td>,
<td aria-label="Market cap" class="Va(m) Ta(end) Pstart(20px) Pend(10px) W(120px) Fz(s)" colspan="" data-reactid="197"><span class="Trsdu(0.3s)" data-reactid="198">9.223B</span></td>,
这是 的输出print(pi)。也是最终的输出。
['159.404M', '533.97M', '', '2.952B', '9.223B', '']
问题
如何避免在上面使用正则表达式替换(re.sub)Main Code来实现给定的最终输出pi?或者建议我正确的方法来做到这一点。我觉得我的正则表达式令人不快。
qq_遁去的一_1
相关分类