
本文介绍一种简洁高效的方式,利用 pandas 内置的 read_html() 函数直接从网页中提取表格数据为 DataFrame,避免手动使用 BeautifulSoup 解析 HTML 的复杂性和常见错误。
本文介绍一种简洁高效的方式,利用 pandas 内置的 `read_html()` 函数直接从网页中提取表格数据为 dataframe,避免手动使用 beautifulsoup 解析 html 的复杂性和常见错误。
在网页数据抓取实践中,许多初学者会尝试用 requests + BeautifulSoup 手动定位
Html2md
使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...
下载
、遍历 和 | 来构建 DataFrame,但这种方式极易出错——例如选择器不准确、嵌套结构干扰、空行/标题行未过滤、文本清洗缺失等。而实际上,pandas 提供了更鲁棒、更简洁的替代方案:pd.read_html()。 该函数可自动解析 HTML 页面中所有
标签,并返回一个 list,其中每个元素都是一个 pd.DataFrame。它底层调用 lxml 或 html5lib 解析器,能智能识别表头(| )、跳过无关容器、处理跨列/跨行单元格(colspan/rowspan),并默认尝试将第一行设为列名(可通过 header 参数控制)。 以维基百科“List of largest banks”页面为例,只需三行代码即可完成核心提取: import pandas as pd
import requests
url = 'https://en.wikipedia.org/wiki/List_of_largest_banks#By_market_capitalization'
response = requests.get(url)
response.raise_for_status() # 确保请求成功
tables = pd.read_html(response.text)
print(f"共找到 {len(tables)} 个表格")
print("第一个表格(按市值排名)预览:")
print(tables[0].head())运行后,tables[0] 即对应锚点 #By-market-capitalization 附近的主表格(实际为页面中第 1 个 wikitable),其列名已自动识别为 'Rank', 'Name', 'Market cap (US$ billion)' 等,数据类型也初步适配(数值列可能为字符串,后续可用 pd.to_numeric(..., errors='coerce') 转换)。
立即学习“前端免费学习笔记(深入)”;
⚠️ 注意事项:
- pd.read_html() 默认要求安装解析器:推荐 pip install lxml(速度快、兼容性好),若未安装则自动回退至 html5lib(需 pip install html5lib);
- 若页面含大量无关表格(如导航栏、广告),可通过 match 参数精准匹配:pd.read_html(response.text, match='Market cap');
- 对于无明确表头的表格,设置 header=0 显式指定首行为列名;若需跳过前几行,可用 skiprows=1;
- 返回的 DataFrame 中文本常含换行符或空白,建议后续统一清洗:df = df.applymap(lambda x: str(x).strip() if isinstance(x, str) else x)(pandas 2.1+ 推荐改用 df.map(...));
- 始终检查 len(tables) 并打印 tables[i].columns 确认目标表格索引,避免硬编码 tables[0] 导致维护风险。
综上,对于标准 HTML 表格提取任务,优先使用 pd.read_html() 是更可靠、更可维护的选择;仅当表格严重非结构化(如动态渲染、JS 拼接、复杂合并单元格)时,才需回归 BeautifulSoup + Selenium 等方案。
|
|