如何在 Python 网页抓取中解析 HTML 图标语义并动态添加正负号标识

本文介绍如何利用 BeautifulSoup 解析 Wikipedia 表格中通过绿色/红色三角图标(含 title 属性)隐含的“增长方向”语义,并将其转化为显式的 `+` 或 `-` 符号,从而准确提取营收增长率的正负含义。

在网页抓取实践中,许多数据并非以纯文本形式呈现,而是借助 HTML 元素(如 <img>、<span> 中的 title 或 CSS 类)传递语义信息。Wikipedia 的“营收增长率”列正是典型场景:它用带 title="Increase" 或 title="Decrease" 的 <span> 包裹三角图标,而实际数值文本却未携带符号。直接调用 .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'<td>{new_content}</td>', '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 属性传递业务语义的表格场景——真正实现“让代码读懂网页的潜台词”。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。