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 个请求,因此您可以使用它而不是从他们的网页上抓取。
我正在尝试制作一个程序,从 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 个请求,因此您可以使用它而不是从他们的网页上抓取。