Python BeautifulSoup抓取网页表格仅返回首行问题求助
问题根因
你访问的目标站点使用Angular框架开发,表格数据是页面加载完成后通过JavaScript动态渲染填充的。你直接用普通HTTP请求(比如requests库)拿到的是未经过JS渲染的初始HTML源码,里面仅包含表格结构和前端模板占位符,没有真实的业务数据,所以BeautifulSoup只能解析到表头和单条模板行,无法拿到更多表格数据。
解决方法
- 方案1:直接调用后端数据接口(优先选择,效率最高)
打开浏览器开发者工具(F12),切换到「网络」面板,筛选「Fetch/XHR」类型的请求,刷新页面后查找返回河流水量数据的接口,直接模拟请求该接口即可拿到JSON格式的全量数据,取索引为23的元素(数组默认从0开始计数,对应第24条数据)即可,无需解析HTML。 - 方案2:使用支持JS渲染的爬虫工具
如果无法定位到数据接口,可以使用Selenium、Playwright这类支持模拟浏览器运行的工具,启动无头浏览器加载完整页面,等待表格数据全部渲染完成后再提取页面源码交给BeautifulSoup解析,此时就能获取到所有真实的表格行数据,直接取第24行即可。
方案2示例代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from bs4 import BeautifulSoup # 配置无头Chrome参数 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") driver = webdriver.Chrome(options=chrome_options) driver.get("http://hydro.marlborough.govt.nz/reports/riverreport.html") # 等待10秒,确保页面JS执行完成、表格渲染完毕 WebDriverWait(driver, 10).until( lambda d: len(d.find_elements("tag name", "tr")) > 20 ) # 提取渲染完成的页面源码解析 soup = BeautifulSoup(driver.page_source, "html.parser") all_table_rows = soup.select("table.table-striped tbody tr") # 取第24行,索引为23 target_row = all_table_rows[23] print(target_row.get_text(strip=True, separator="|")) driver.quit()
内容的提问来源于stack exchange,提问作者arnoldalscomputingconz
相关产品推荐
相关产品推荐

