Beautiful Soup 没有得到完整的 table

Beautiful Soup is not getting the entire table

我正在尝试制作一个程序,从 Yahoo Finance 的列表中获取股票代码。我试过了 将 html5lib 更改为 lxml 和 html.parser。这些都不适合我。 网址是:https://finance.yahoo.com/screener/unsaved/f491bcb6-de80-4813-b50e-d6dc8e2f5623?dependentField=sector&dependentValues=Consumer%20Cyclical

应该有 25 个结果,但如果您按 运行 查看,我们只能得到大约一半。 (13)

有人有解决办法吗?

import requests

headers = {'User-Agent'      : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', 'Accept'          : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
 'Accept-Language' : 'en-US,en;q=0.5', 'DNT'             : '1', # Do Not Track Request Header 'Connection'      : 'close'
}

from bs4 import BeautifulSoup


URL = 'https://finance.yahoo.com/screener/unsaved/f491bcb6-de80-4813-b50e-d6dc8e2f5623?dependentField=sector&dependentValues=Consumer%20Cyclical'
page = requests.get(URL, headers=headers, timeout=5)

soup = BeautifulSoup(page.content, "html5lib")

results = soup.find(id="screener-results")

stock_ = results.find_all("tr", class_="simpTblRow Bgc($hoverBgColor):h BdB Bdbc($seperatorColor) Bdbc($tableBorderBlue):h H(32px) Bgc($lv2BgColor)")

x = 0
for stock_ in stock_:
  x = x + 1
  stock_symbol = stock_.find('a', class_='Fw(600) C($linkColor)')

  print(str(stock_symbol.text.strip()) + '\n' + str(x))

有一个简单的解决方法。 table 为每一行使用交替颜色,因此一行的颜色为 Bgc($lv2BgColor),下一行的颜色为 Bgc($lv1BgColor)。由于您只获得 Bgc($lv2BgColor) 的结果,因此您只能获得一半的结果。 这里是网页相关HTML的截图

在您的情况下,实际上 class 不需要如此精确,只需使用 class_="simpTblRow" 即可获得所有结果。

顺便说一下:还有一个 Yahoo Finance API 每天最多可免费请求 100 个请求,因此您可以使用它而不是从他们的网页上抓取。