使用BeautifulSoup无法抓取网页表格,table变量返回None求助
解决表格抓取返回None的问题
问题原因
这个页面的表格数据是JavaScript动态渲染的:直接用requests.get()获取的是服务器返回的初始静态HTML,其中并不包含实际的<table>标签——表格内容是浏览器加载页面后,通过AJAX请求从后端API拉取数据再生成的,所以BeautifulSoup找不到对应的table元素。
解决方案
方案1:直接请求数据API(推荐,效率更高)
通过浏览器开发者工具的「网络」面板,可以找到页面加载表格数据的真实API接口。对于这个页面,我们可以直接请求返回CSV格式数据的接口,无需解析HTML:
import requests import pandas as pd # 带csv=true参数的API接口,直接返回表格数据的CSV格式 api_url = "https://baseballsavant.mlb.com/leaderboard/outs_above_average?type=Fielder&startYear=2022&endYear=2022&split=no&team=&range=year&min=10&pos=of&roles=&viz=hide&csv=true" response = requests.get(api_url) # 解析CSV数据并输出前几行 data = pd.read_csv(pd.compat.StringIO(response.text)) print(data.head())
如果需要处理JSON格式数据,也可以找到对应的XHR请求接口,用response.json()解析。
方案2:使用浏览器自动化工具(处理动态渲染页面)
如果无法找到API接口,可以用Selenium模拟浏览器加载页面,待JavaScript渲染完成后再抓取HTML:
from selenium import webdriver from bs4 import BeautifulSoup import time url = "https://baseballsavant.mlb.com/leaderboard/outs_above_average?type=Fielder&startYear=2022&endYear=2022&split=no&team=&range=year&min=10&pos=of&roles=&viz=show" # 初始化Chrome浏览器驱动(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) # 等待页面完全加载(根据网络情况调整等待时间) time.sleep(3) # 获取渲染后的页面源码 soup = BeautifulSoup(driver.page_source, "lxml") table = soup.find("table") if table: # 遍历表格行并输出单元格文本 for row in table.find_all("tr"): print([cell.text.strip() for cell in row.find_all("td")]) # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者earningjoker430
相关产品推荐
相关产品推荐

