本文介绍如何利用 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())✅ 关键要点说明:
⚠️ 注意事项:
、转换为浮点数),建议在 pandas 加载后使用 df['Revenue growth'].str.extract(r'([+-])\s*(\d+\.\d+)%') 进行结构化解析。该方法不仅适用于 Wikipedia,也适用于任何通过 HTML 属性传递业务语义的表格场景——真正实现“让代码读懂网页的潜台词”。