最稳方式是file_get_contents()配合DOMDocument解析表格,因其容错性强、支持乱码处理、能准确提取textContent,且避免正则匹配嵌套table或JS渲染导致的崩溃。

用 file_get_contents() + DOMDocument 解析表格最稳
直接用 file_get_contents() 拿到 HTML,再丢给 DOMDocument 解析,是 PHP 抓取网页表格最可靠的方式。正则匹配 标签容易崩——只要页面里有嵌套 、JS 动态插入、或属性换行,就大概率漏数据或报错。
实操建议:
-
libxml_use_internal_errors(true) 必加,否则 HTML 不规范(比如缺少闭合标签)会直接抛 Warning 中断脚本
- 加载后调用
$dom->loadHTML(mb_convert_encoding($html, 'HTML-UTF8', 'UTF-8')),避免中文乱码
- 用
$dom->getElementsByTagName('table') 获取所有表格,再按索引或 class 属性定位目标表,比如 $table = $tables->item(0)
- 遍历
→ 或 时,用 $cell->textContent 取值,别用 nodeValue ——它会把内部标签(如 )也当文本拼进去
遇到 JavaScript 渲染的表格怎么办
如果 file_get_contents() 拿到的 HTML 里没有 ,说明表格由 JS 动态生成。PHP 原生不执行 JS,硬抓没用。
可行路径只有两个:
立即学习“PHP免费学习笔记(深入)”;
- 查网页 Network 面板,看表格数据是否来自独立 API 接口(比如
/api/data?year=2024),直接请求那个 URL,通常返回 JSON,用 json_decode() 解析更干净
- 真要渲染页面,得换工具:用
headless Chrome 配合 Puppeteer 或 Selenium,PHP 调用其 HTTP 接口(如 chrome-devtools-protocol 封装服务),但部署成本高,仅限必要场景
别试 file_get_contents() 加延时再读——没用,PHP 不跑 JS。
simple_html_dom 能不能用?慎选
这个第三方库写法看着简单,比如 $html->find('table tr'),但实际问题不少:
- 对 malformed HTML 容错差,某些页面会卡死或返回空数组
-
内存占用比原生
DOMDocument 高一倍以上,抓大表格(千行+)容易超限
- 不支持命名空间,遇到 XHTML 或含
xmlns 的表格,find() 可能完全失效
- 已多年未维护,PHP 8.1+ 下部分方法有弃用警告
除非项目已重度依赖它且无法重构,否则新代码优先用 DOMDocument。
表格跨行(rowspan)、跨列(colspan)怎么对齐
原始 HTML 表格结构 ≠ 二维数组。遇到 rowspan="2",同一单元格会在两行中“出现”,但 DOM 解析后只有一份节点。手动还原逻辑必须补位。
关键点:
- 遍历前初始化二维数组
$grid = [],并记录当前行号 $row 和列号 $col
- 对每个
,先跳过已被上一行 rowspan 占用的位置(查 $grid[$row][$col] 是否已设值)
- 取
$cell->getAttribute('rowspan') 和 $cell->getAttribute('colspan'),循环向右/向下填空值,确保后续行的列索引正确
- 别依赖
getElementsByTagName('td') 的顺序——它按文档流返回,不是按表格视觉位置
这步逻辑看似琐碎,但漏掉就会导致整张表列错位,而且错误往往只在特定表格中暴露,上线后才踩坑。
|
|
|