如何使用Python BeautifulSoup解析结构复杂的动态网页表格?

P粉602998670

P粉602998670

2026-08-04

616人浏览

原创

BeautifulSoup无法解析动态网页表格,因其仅处理静态HTML;JavaScript渲染内容需通过Playwright等待DOM就绪后解析,或更优地直接逆向API接口获取JSON数据。

如何使用python beautifulsoup解析结构复杂的动态网页表格?

BeautifulSoup 本身无法解析动态网页表格

它只处理静态 HTML,JavaScript 渲染的内容(比如通过 fetchAJAX 加载的表格)在源码里根本不存在。直接用 BeautifulSoup 解析 requests.get(url).text,拿到的多半是空 <table> 或占位符 <code><div id="loading">。<p>真正要做的,是先让页面“执行完 JS”,再把最终 DOM 交给 <code>BeautifulSoup。这意味着你得换工具——requests 不够,得上浏览器自动化或 API 逆向。

优先尝试:绕过浏览器,直连数据接口

多数动态表格背后是 REST API 或 GraphQL 请求,比跑整个浏览器快得多、稳定得多。打开浏览器开发者工具(F12),切到 Network 标签页,操作表格(翻页、筛选、刷新),找带 jsondataapi 字样的 XHR/Fetch 请求。

  • 右键请求 → CopyCopy as cURL,再用在线工具转成 requests 代码
  • 注意检查 headers(尤其是 User-AgentRefererCookieAuthorization
  • 响应如果是 JSON,直接 response.json() 提取数据;如果是 HTML 片段(如 innerHTML 字段),再喂给 BeautifulSoup

必须用浏览器时:选 Playwright 而不是 Selenium

Selenium 启动慢、依赖外部驱动、容易被反爬识别。Playwright 内置浏览器、API 更简洁、默认支持等待网络空闲和元素就绪,更适合表格场景。

示例:等表格数据加载完成再解析

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup
<p>with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("<a href="https://www.php.cn/link/1741c0f8d90a180b893a1776ae281820">https://www.php.cn/link/1741c0f8d90a180b893a1776ae281820</a>")</p><pre class="brush:php;toolbar:false;"># 等待表格容器出现且有 <tr> 子元素(比单纯等 selector 更可靠)
page.wait_for_selector("table#data-table tbody tr", state="attached", timeout=10000)

# 获取渲染后 HTML
html = page.content()
soup = BeautifulSoup(html, "html.parser")
rows = soup.select("table#data-table tbody tr")<p></p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2506" title="Python 3.14.2"><img
														src="https://img.php.cn/upload/manual/001/221/864/6a696c31dfa4a111.webp" alt="Python 3.14.2" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/gongju/2506" title="Python 3.14.2" class="overflowclass">Python 3.14.2</a>
													<p class="overflowclass">Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。</p>
												</div>
												<a rel="nofollow" href="/xiazai/gongju/2506" title="Python 3.14.2" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>
<p>关键点:<code>wait_for_selector</code> 的 <code>state="attached"</code> 比 <code>"visible"</code> 更稳妥——有些表格行初始 <code>display:none</code>,但 DOM 已存在。</p>
<h3>解析复杂嵌套表格时,避开 <code>find_all("tr")</code> 直接遍历</h3>
<p>真实页面里常有合并单元格(<code>rowspan</code>/<code>colspan</code>)、嵌套 <code><table>、脚手架行(如分组标题、合计行),用扁平化 <code>tr</code> 列表会错位。<p>更稳的做法是:定位主体 <code><tbody>,再按逻辑区块提取<ul>
<li>用 <code>soup.select("tbody > tr:not(.header-row):not(.summary-row)")</code> 排除非数据行</li>
<li>对每行,用 <code>row.find_all(["td", "th"], recursive=False)</code> 避免抓到子表格里的单元格</li>
<li>遇到 <code>rowspan</code>,需手动维护列偏移计数器,不能依赖索引对齐</li>
</ul>
<p>如果表格结构极不规则,不如直接用 <code>pandas.read_html()</code> ——它内部做了 rowspan/colspan 补全,对多数报表型表格效果意外好。</p>
<p>动态表格真正的难点不在解析,而在确认数据来源路径是否稳定。接口 URL 改了、参数签名升级、Cookie 过期、甚至返回字段名小写变大写,都会让解析逻辑突然失效。留好日志,把原始响应体存下来,比反复调浏览器调试高效得多。</p>
</tbody></code></p>
</table></code></p>
</tr>

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1104

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2025

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1184

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8474

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1429

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1503

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

859

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1084

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习