从 HTML 表格提取数据
学习可靠地解析 HTML 表格数据、处理 rowspan 和 colspan,并将杂乱表格转换为整洁的结构化行。
从 HTML 表格提取数据 是 CoddyKit 上的免费 Web Scraping & Bots 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Web Scraping & Bots 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Web Scraping & Bots 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Why Tables Are Tricky
HTML <table> elements look simple but are one of the most error-prone targets in scraping. Rows can merge cells, headers can repeat, and layout tables masquerade as data tables.
- Data tables hold real records you want.
- Layout tables only control visual structure.
This lesson focuses on extracting clean rows from genuine data tables.
Anatomy of a Table
A table is built from a few key tags:
<thead>/<tbody>group header and body rows.<tr>is a single row.<th>is a header cell,<td>is a data cell.
Knowing these landmarks lets you target rows precisely instead of grabbing raw text.
<table>
<thead><tr><th>Name</th><th>Price</th></tr></thead>
<tbody>
<tr><td>Widget</td><td>$9.99</td></tr>
<tr><td>Gadget</td><td>$14.50</td></tr>
</tbody>
</table>Selecting Rows
With a parser like BeautifulSoup you first find the table, then iterate its rows. Always scope your selection to tbody when present so the header row does not contaminate your data.
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
table = soup.select_one('table')
rows = table.select('tbody tr')
print(len(rows), 'data rows found')Reading Cell Values
For each row, collect the cell text. Use get_text(strip=True) to drop surrounding whitespace and nested tag noise.
for row in rows:
cells = [c.get_text(strip=True) for c in row.select('td')]
print(cells)Mapping Headers to Values
Raw lists of cells are fragile. Pair each value with its column header so your output is self-describing and column-order changes do not break downstream code.
headers = [h.get_text(strip=True) for h in table.select('thead th')]
records = []
for row in rows:
cells = [c.get_text(strip=True) for c in row.select('td')]
records.append(dict(zip(headers, cells)))
print(records[0])Handling colspan
A cell with colspan="2" visually spans two columns. If you ignore it, every following cell shifts left and misaligns with its header. Read the attribute and pad accordingly.
span = int(cell.get('colspan', 1))
values.extend([text] * span)Handling rowspan
rowspan is harder: a cell carries down into rows below it. Track a buffer of pending values keyed by column index and inject them into subsequent rows until the span is exhausted.
pending = {}
for r_idx, row in enumerate(rows):
col = 0
for cell in row.select('td'):
while col in pending and pending[col][1] > 0:
col += 1
rs = int(cell.get('rowspan', 1))
if rs > 1:
pending[col] = [cell.get_text(strip=True), rs]
col += 1Cleaning Extracted Values
Cells often contain currency symbols, thousands separators, or stray unicode. Normalize before storing:
- Strip
$,,and whitespace. - Cast numeric strings to numbers.
- Replace non-breaking spaces.
def clean_price(text):
text = text.replace('$', '').replace(',', '').strip()
return float(text) if text else None
print(clean_price('$1,299.00'))Pandas read_html Shortcut
For well-formed tables, pandas.read_html parses every table on a page into DataFrames in one call. Use it for quick wins, then fall back to manual parsing for tables with merged cells.
import pandas as pd
tables = pd.read_html(html)
df = tables[0]
print(df.head())Detecting Layout vs Data Tables
Before extracting, confirm the table holds real data. Heuristics:
- Has a
<thead>or repeated<th>cells. - Multiple rows with consistent column counts.
- No nested tables used purely for spacing.
Skip tables that fail these checks.
Putting It Together
A robust table extractor: locate the data table, read headers, walk rows while resolving spans, clean each value, and emit a list of dictionaries. This pipeline survives most real-world markup.
def extract_table(table):
headers = [h.get_text(strip=True) for h in table.select('thead th')]
out = []
for row in table.select('tbody tr'):
vals = [c.get_text(strip=True) for c in row.select('td')]
out.append(dict(zip(headers, vals)))
return outQuick Check
Test your understanding of table parsing.
Recap
You learned to extract clean records from HTML tables: scope to tbody, map headers to values, resolve colspan and rowspan, clean cell text, and use pandas.read_html for simple cases.
With these skills you can turn even messy tabular markup into reliable structured data.
常见问题解答
「从 HTML 表格提取数据」课时是免费的吗?
是的 — 「从 HTML 表格提取数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Web Scraping & Bots 课程的其余内容,请升级到 CoddyKit PRO。 Web Scraping & Bots 课程共包含 4 节课。
「从 HTML 表格提取数据」这节课中我会学到什么?
学习可靠地解析 HTML 表格数据、处理 rowspan 和 colspan,并将杂乱表格转换为整洁的结构化行。 你通过在浏览器中直接运行的动手代码来练习 Web Scraping & Bots,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Web Scraping & Bots 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Web Scraping & Bots 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「从 HTML 表格提取数据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Web Scraping & Bots 课中编写并运行代码吗?
能。每节 Web Scraping & Bots 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 处理复杂 HTML 结构
- 使用 CSS 选择器精准提取
- 使用 XPath 稳健选择
- 从 HTML 表格提取数据