
本文介绍如何利用 beautifulsoup 解析 wikipedia 表格中通过绿色/红色三角图标(含 title 属性)隐含的“增长方向”语义,并将其转化为显式的 `+` 或 `-` 符号,从而准确提取营收增长率的正负含义。
在网页抓取实践中,许多数据并非以纯文本形式呈现,而是借助 HTML 元素(如 、 中的 title 或 CSS 类)传递语义信息。Wikipedia 的“营收增长率”列正是典型场景:它用带 title="Increase" 或 title="Decrease" 的 包裹三角图标,而实际数值文本却未携带符号。直接调用 .text.strip() 会丢失这一关键逻辑,导致所有增长率都显示为正值。
要正确还原正负含义,核心思路是:定位承载语义的 HTML 节点 → 提取其语义属性(如 title)→ 根据条件修改对应单元格内容。
以下是一个健壮、可复用的解决方案:
from bs4 import BeautifulSoup
import pandas as pd
import requests
url = 'https://en.wikipedia.org/wiki/List_of_largest_companies_in_the_United_States_by_revenue'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 定位所有含 title 属性的 span 的父 td(即营收增长率所在单元格)
for td in soup.select('td:has(span[title])'):
try:
# 获取嵌套 span 的 title 值(注意层级:td > span > span)
title = td.find('span').find('span')['title']
text_value = td.get_text(strip=True)
if title == 'Increase':
new_content = f'+ {text_value}'
elif title == 'Decrease':
new_content = f'- {text_value}'
else:
new_content = text_value # 保底:未知 title 不修改
# 替换整个 td 内容(保留结构,仅更新文本与符号)
td.replace_with(BeautifulSoup(f'{new_content} ', 'html.parser'))
except (AttributeError, KeyError, TypeError):
# 容错:跳过结构异常的单元格(如缺失 span 或 title)
continue
# 使用 pandas 读取已修正的 HTML 表格(推荐索引为 1,因首表常为导航栏)
df = pd.read_html(str(soup))[1]
print(df[['Name', 'Revenue growth']].head())✅ 关键要点说明:
立即学习“Python免费学习笔记(深入)”;
- soup.select('td:has(span[title])') 是精准定位的关键:CSS 选择器 :has() 可筛选出包含带 title 属性 的
,避免遍历全部单元格。 - 注意 DOM 结构:Wikipedia 实际使用 td > span > span 嵌套,因此需 td.find('span').find('span')['title'],而非直接查 img(原问题中图标已由 SVG 替代,alt 属性不可靠)。
- 使用 replace_with() + BeautifulSoup(..., 'html.parser') 确保新内容被正确解析为 HTML 节点,避免字符串拼接引发的转义或结构破坏。
- 异常处理(try/except)必不可少:网页结构可能随编辑变动,忽略个别失败项比中断整个流程更鲁棒。
- 最终交由 pandas.read_html() 解析,既简洁又自动处理表头、类型推断等细节,远胜手动构建列表。
⚠️ 注意事项:
- 不要依赖 img[alt] —— 当前 Wikipedia 已将三角图标改为 inline SVG,alt 属性常为空或缺失;title 属性才是稳定语义源。
- 避免在循环中直接修改 row_data 后再调用 data.text:此时 DOM 已变更,原始 .text 可能失效。应先提取语义,再统一替换。
- 若需进一步清洗(如去除空格、转换为浮点数),建议在 pandas 加载后使用 df['Revenue growth'].str.extract(r'([+-])\s*(\d+\.\d+)%') 进行结构化解析。
该方法不仅适用于 Wikipedia,也适用于任何通过 HTML 属性传递业务语义的表格场景——真正实现“让代码读懂网页的潜台词”。











