夜雨聆风学习资料网

ARTICLE · 1142894

网页表格一键搬进Excel

网页表格一键搬进Excel

你是不是也卡在"把网页表格抄进 Excel"这件事上

每次看到网页上那种整整齐齐的表格,想把数据存下来慢慢分析,是不是只能一行行复制粘贴?几百行抄完,手都麻了,还容易抄错。其实这种活儿,最该交给电脑自己干。今天教你一招 RPA 里最爽的入门场景——把网页表格自动搬进 Excel,你只管看结果就行。

这种活儿,RPA 管它叫"网页表格采集"

RPA 说白了就是"让机器人替你重复点鼠标、搬数据"。网页上现成的表格,就是最理想的练习对象。以前你可能觉得要学爬虫、学正则表达式,门槛吓人。其实现在有现成工具,核心就一行代码,不用懂网页结构也能抓。咱们这次用 Python 的 pandas 库,它有个专门读网页表格的函数,叫 read_html,特别适合新手。

先整一个练习用的小网页

为了让你马上能跑通,咱不联网,先在本机造一个带表格的网页文件。把下面的代码存成 make_demo.py 跑一次,文件夹里就会出现 demo.html:

# 造一个带表格的练习网页,跑一次就有 demo.html 了

html = """<html><body>

<table border="1">

  <tr><th>商品</th><th>价格</th><th>库存</th></tr>

  <tr><td>机械键盘</td><td>299</td><td>12</td></tr>

  <tr><td>无线鼠标</td><td>99</td><td>40</td></tr>

  <tr><td>高清显示器</td><td>899</td><td>5</td></tr>

</table>

</body></html>"""

open("demo.html", "w", encoding="utf-8").write(html)

print("demo.html 已生成,去文件夹里看一眼")

装一下要用的库,后面全靠它俩:pip install pandas openpyxl。openpyxl 是写 Excel 用的,缺了它会报错,别漏装。

核心其实就一行,把表格读成 Excel

真正的重头戏只有这三行,我把注释写清楚了:

import pandas as pd

df = pd.read_html("demo.html")[0]   # [0] 表示拿网页里的第一张表

df.to_excel("商品表.xlsx", index=False)  # index=False 不写多余的行号

print("搞定,共", len(df), "行,已存成 商品表.xlsx")

跑完去文件夹里打开 商品表.xlsx,是不是三行数据整整齐齐躺在里面了?这就是 RPA 的快感——你没动一下鼠标,数据自己就归位了。

来,写上完整能用的脚本

练习跑通了,咱们把它包成一个小函数,以后换个网页路径就能直接用,还带个找不到文件的提醒:

import pandas as pd

import os

def save_table(page_path, out_name="结果.xlsx", table_index=0):

    if not os.path.exists(page_path):

        print("找不到文件:", page_path)

        return

    tables = pd.read_html(page_path)

    print(f"这张网页里一共找到 {len(tables)} 张表")

    df = tables[table_index]

    df.to_excel(out_name, index=False)

    print(f"已存成 {out_name},共 {len(df)} 行 × {len(df.columns)} 列")

# 直接跑:把 demo.html 搬成 Excel

save_table("demo.html", "商品表.xlsx")

一个网页里可能塞了好几张表,[0] 是第一张。要是你想要第二张、第三张,把 table_index 改成 1、2 就行。你可以试着改改看,体会一下这种自己掌控的感觉。

碰到 JS 动态加载的网页怎么办

上面这招对付"右键看源码里就有 <table>"的静态网页特别灵。可有些网站的数据是 JavaScript 跑完才显示出来的,你用 read_html 直接读文件,会扑个空——因为它读的是没渲染的空壳。这时候就得请浏览器先帮我们把页面"跑"出来。这里用 playwright,它相当于一个看不见的浏览器:

# 先装两样:pip install playwright,再跑一次 playwright install chromium

from playwright.sync_api import sync_playwright

import pandas as pd

url = "这里换成你要抓的网页地址"

with sync_playwright() as p:

    browser = p.chromium.launch(headless=True)

    page = browser.new_page()

    page.goto(url, wait_until="networkidle")  # 等页面安静下来,JS 渲染完

    html = page.content()        # 拿到渲染后的完整源码

    browser.close()

tables = pd.read_html(html)

print("找到", len(tables), "张表")

tables[0].to_excel("真实数据.xlsx", index=False)

print("抓到了", len(tables[0]), "行,已存成 真实数据.xlsx")

wait_until="networkidle" 这句很关键,它让程序等到网络不再疯狂请求了才动手,表格基本就稳了。

想抓真实网站?把网址换掉就行

把上面 url 那行换成任何带表格的网页地址,比如某个商品列表页、排行榜页,就能抓真实数据了。不过说句掏心窝的话,抓别人网站前先看一眼对方的 robots.txt 和服务条款,别抓太狠——在代码里加个 page.wait_for_timeout(2000) 之类的小停顿,或者隔一会儿抓一次,既对人家服务器友好,也不容易把自己 IP 搞被封。要是中文乱码,读的时候加个编码:pd.read_html(html, encoding="utf-8")。

新手最常踩的 4 个坑

- read_html 报错说找不到表格:十有八九那个页面根本不是 <table> 画的,可能是 div 拼的假表格,这种得换别的办法,别死磕。

- 抓出来是空的:多半是 JS 动态加载,回到上一节的 playwright 方案,先渲染再读。

- 中文变成乱码方块:读的时候指定编码,比如 encoding="utf-8" 或 "gbk",看网页本身用哪种。

- 一张网页好几张表,存错那张:先 print(len(tables)) 看看有几张,再调 table_index 选你要的那张,别上来就闷头用 [0]。

写在最后

你看,把网页表格搬进 Excel 这件事,从手抄一下午到三行代码搞定,中间只差一个 pandas.read_html。静态页用它,动态页加个 playwright,基本能cover你八成的"表格搬运"需求。下次再遇到想存下来的网页表格,别急着复制粘贴了,把今天的脚本翻出来改个路径试试。你平时最烦哪种重复搬运的活儿?评论区跟我说说,说不定下一篇就写它。

相关学习资料