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

















