pd.read_html()不是爬虫,它仅解析html字符串中的标签,不发请求、不执行js、不处理登录或反爬,需先用requests等工具获取html源码再传入。

直接说结论: 常见现象:调用后返回 这是最常用、可控性最强的做法。requests 负责拿源码, 网页常有多个 不是所有 HTML 表格都能“开箱即用”。有些坑只有真遇到才记得住。 真正卡住的地方,往往不是 pd.read_html() 不是爬虫,它只解析 HTML 字符串里的 <table>,不发请求、不执行 JS、不处理登录或反爬——想用它“爬网页”,得先自己把 HTML 拿回来。
<h3>为什么 <code>pd.read_html() 会报错或返回空列表
[],或者抛出 ValueError: No tables found。根本原因不是函数坏了,而是它压根没看到 <table> 标签。
<ul>
<li>你传的是 URL 字符串(比如 <code>"https://example.com"),但 pandas 1.4+ 默认已禁用 URL 自动下载(出于安全和明确性考虑)
pd.read_html() 只看静态 HTML 源码,不跑 JS)read_html()
<table>,可能是用 <code><div> + CSS 模拟的“假表格”
<h3>怎么正确配合 requests 获取网页 HTML 再交给 <code>pd.read_html()
pd.read_html() 负责解析。requests.get() 获取响应,检查 r.status_code == 200 和 r.text 是否含 <table>
<li>中文网页注意设置 <code>r.encoding = r.apparent_encoding,否则表格文字可能乱码pd.read_html() 的必须是字符串(r.text),不是 Response 对象match="订单" 只找含“订单”的表格,避免误取广告位里的 <table>
<p>示例:</p>
<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/1838" title="皮卡智能"><img
src="https://img.php.cn/upload/ai_manual/000/969/633/68b6c8bab1e36588.png" alt="皮卡智能" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/1838" title="皮卡智能">皮卡智能</a>
<p>AI驱动高效视觉设计平台</p>
</div>
<a href="/ai/1838" title="皮卡智能" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>
<pre class="brush:php;toolbar:false;">import pandas as pd
import requests
r = requests.get("https://httpbin.org/html")
r.encoding = r.apparent_encoding
tables = pd.read_html(r.text, match="table", header=0)</pre>
<h3>
<code>pd.read_html() 返回多个 DataFrame,怎么选对的那个
<table>(导航栏、页脚、数据表混在一起),<code>pd.read_html() 默认全返回一个 list,你需要手动挑。
len(tables) 看有几个,再逐个打印 tables[0].head() 观察结构shape:真实数据表通常行数 > 5,列数 > 2;空表或单行表大概率是装饰用attrs={"class": "data-table"} 或 attrs={"id": "main-table"} 锁定特定 <table>,比靠顺序更可靠
<li>如果表格有合并单元格(<code>rowspan/colspan),pandas 可能解析错行,这时要加 flavor="html5lib"(需装 html5lib)容易被忽略的兼容性和边界情况
pd.read_html() 默认用 lxml 解析器,但某些畸形 HTML(如未闭合标签、嵌套错乱)会崩,换 flavor="html5lib" 更容错,但慢一点header=0;没有标题?加 header=None,否则 pandas 会强行把第一行当列名"1,234")或货币符号("¥100"),默认转成 object 类型,后续计算前得用 str.replace() 清洗requests 拿到的主页面 HTML 里没有它——得单独请求 iframe 的 src 地址read_html() 本身,而是你拿到的 HTML 里到底有没有那个 table,以及它是不是你以为的样子。










