Requests不解析HTML表格,需搭配pandas或BeautifulSoup;pandas.read_html()需传resp.content并加headers防403;BS4用.get_text(strip=True)处理嵌套标签;JS渲染表格需换Selenium或找API。

Requests本身不解析HTML表格,必须搭配其他库
Requests只负责发请求、收响应,response.text拿到的是原始HTML字符串,里面哪怕有标签,它也不会自动转成二维数据。你得自己从字符串里定位、提取、结构化——这活儿没人想手动干。实操建议:
- 优先用
pandas.read_html():一行代码就能把页面里所有转成DataFrame列表,适合结构规整的静态表格- 复杂或嵌套表格用
BeautifulSoup + requests:先用requests.get()拿HTML,再用BeautifulSoup定位/逐行解析- 别用正则直接匹配
:HTML嵌套不规则,正则容易漏掉换行、属性、注释,维护成本高用pandas.read_html()时常见403错误怎么绕过
pandas.read_html()底层其实会调用requests(默认无headers),很多网站看到User-Agent是python-requests/2.x就直接返回403。这不是代码写错了,是被反爬了。
解决办法很简单:自己先发带headers的请求,再把response.content喂给read_html():
import pandas as pd
import requests
<p>headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
resp = requests.get("<a href="https://www.php.cn/link/1741c0f8d90a180b893a1776ae281820">https://www.php.cn/link/1741c0f8d90a180b893a1776ae281820</a>", headers=headers)
resp.raise_for_status()</p><p>tables = pd.read_html(resp.content) # 注意传 bytes,不是 resp.text
</p>
- 必须用
resp.content(bytes),传resp.text(str)会报编码错
- 如果页面含中文,且
resp.encoding识别错,手动设:resp.encoding = "utf-8"
- 某些表格需要指定
match=参数过滤,比如pd.read_html(..., match="营收")只取含“营收”的表
BeautifulSoup解析表格时| 里有嵌套标签怎么办 真实网页表格常在里塞、甚至,直接 td.text会连带抓到多余空白和换行,或者漏掉链接文字。 稳妥做法是用.get_text(strip=True):
Python 环境工具专业版
Python 环境工具专业版功能概述Python 环境工具专业版是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。执行完成后建议检查结果是否符合预期,并保留必要记录。使用与执行同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能
下载
from bs4 import BeautifulSoup
import requests
<p>soup = BeautifulSoup(requests.get(url).content, "html.parser")
for row in soup.select("table tr"):
cells = [td.get_text(strip=True) for td in row.select("td, th")]
if cells: # 跳过空行
print(cells)
</p>
-
strip=True自动清理首尾空白和换行,比.text.strip()更鲁棒
- 用
row.select("td, th") 同时抓表头和单元格,避免被忽略- 如果
里有链接且你关心href,单独用td.find("a")["href"]提取,别混在文本里为什么有时候表格数据是空的,但浏览器能看见
Requests只能拿到服务器返回的初始HTML,如果表格是JavaScript动态渲染的(比如用fetch()加载JSON再拼DOM),那requests.get()返回的HTML里根本就没有——不是你代码有问题,是源头没数据。判断方法:
- F12打开开发者工具 → 看Network → 切到“Doc”或“HTML”类型,刷新页面,确认目标URL是否真返回了含表格的HTML
- 右键网页 → “查看网页源代码”,搜索
,如果搜不到,基本就是JS渲染- 这种场景Requests无解,得换
Selenium或Playwright,或者找页面背后的API接口(XHR/Fetch)
静态表格看似简单,但最容易栽在“以为它是静态的”这个假设上——动手前先看源码,比调半天BeautifulSoup更省时间。
|
|
|
|
|
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!