本文介绍如何利用 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())
✅ 关键要点说明:
⚠️ 注意事项:
该方法不仅适用于 Wikipedia,也适用于任何通过 HTML 属性传递业务语义的表格场景——真正实现“让代码读懂网页的潜台词”。
来电咨询