使用Python与BeautifulSoup爬取时,指定class查询返回空结果?
问题排查与解决办法
嘿,作为编程新手遇到这种问题太正常了!我来帮你拆解一下可能的原因和对应的解决办法:
第一个可能:多Class的写法错误
你用了 soup.findAll('table', class_='playerTable rtable'),这里的问题在于:HTML里的 class="playerTable rtable" 其实表示这个表格同时拥有两个独立的Class——playerTable 和 rtable,而不是一个叫 playerTable rtable 的单一Class。
BeautifulSoup的 class_ 参数如果接收空格分隔的字符串,会把它当作一个完整的Class名称去匹配,自然找不到对应的元素。你可以改成两种写法:
- 用列表传递多个Class:
tables = soup.findAll('table', class_=['playerTable', 'rtable']) - 用CSS选择器(更简洁,推荐):
tables = soup.select('table.playerTable.rtable')
第二个可能:页面内容是动态加载的
如果上面的写法还是返回空列表,那大概率是这个表格是通过JavaScript动态渲染出来的——你用 requests 获取到的只是网站的初始HTML框架,实际的表格数据是浏览器加载页面后,通过JS请求接口再渲染出来的,所以静态HTML里根本没有这个表格。
这时候你需要用浏览器自动化工具(比如Selenium)来模拟浏览器加载页面,等内容渲染完成后再获取HTML:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup url = "http://www.spotrac.com/nfl/denver-broncos/peyton-manning-5028/" # 初始化Chrome浏览器(需要提前安装对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) # 等待表格加载完成(最多等10秒) wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'table.playerTable.rtable'))) # 获取渲染后的完整HTML html = driver.page_source soup = BeautifulSoup(html, 'html.parser') # 现在再查找表格 tables = soup.select('table.playerTable.rtable') print(len(tables)) # 应该能看到正确的数量了 driver.quit()
额外小提示
你可以先把 requests.get 获取到的HTML保存到本地文件,打开看看里面有没有 playerTable rtable 这个Class的表格——如果没有,那肯定是动态加载的问题,直接用Selenium就行;如果有,那就是第一个写法的问题。
内容的提问来源于stack exchange,提问作者Tyler Anderson
相关产品推荐
相关产品推荐

