You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Scraping嵌套table表格:如何解决数据重复问题?

解决嵌套表格导致的网页抓取数据重复问题

问题根源是常规表格解析会递归抓取所有层级的<tr>标签,包括嵌套在主表格单元格内的子表格行,这就导致主表格数据混入重复或无关的子行(比如你提到的第33、35行)。

以下是基于BeautifulSoup的解决方案,核心是只遍历主表格的直接子元素,避免解析嵌套表格的内容:

代码实现

import requests
from bs4 import BeautifulSoup

# 目标URL
url = "https://www.ctdol.state.ct.us/progsupt/bussrvce/warnreports/warn2016.htm"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 定位主表格:根据页面结构,这里主表格是页面中的第二个table(可根据实际情况调整索引)
main_table = soup.find_all('table')[1]

# 获取主表格的直接子<tr>,禁用递归查找(避免抓取嵌套表格的行)
main_rows = main_table.find_all('tr', recursive=False)

# 遍历处理每一行数据
for idx, row in enumerate(main_rows, 1):
    # 获取当前行的直接子<td>,同样禁用递归
    cells = row.find_all('td', recursive=False)
    row_data = []
    
    for cell in cells:
        # 检查单元格是否包含嵌套表格
        nested_table = cell.find('table')
        if nested_table:
            # 提取嵌套表格的所有文本并合并,保留完整信息
            nested_content = ' '.join(nested_table.stripped_strings)
            row_data.append(nested_content)
        else:
            # 直接提取单元格文本
            row_data.append(cell.get_text(strip=True))
    
    # 输出处理后的行数据(也可以写入文件或存储为DataFrame)
    print(f"第{idx}行: {row_data}")

关键说明

  1. recursive=False参数:这是解决重复问题的核心。使用该参数后,find_all只会查找当前元素的直接子节点,不会深入到嵌套的<table>标签内部,彻底避免把子表格的行当成主表格的行。
  2. 嵌套表格内容处理:对于包含子表格的单元格,提取其内部所有文本并合并成一个字符串,既保留完整信息,又不会破坏主表格的行结构。
  3. 主表格定位:示例中通过索引定位主表格,你也可以根据页面特征(比如表格的id、class,或者相邻的文本内容)更精准地定位,避免索引变化导致的错误。

处理后,主表格的每一行数据都会和参考样式一致,不会再出现重复的行。

内容的提问来源于stack exchange,提问作者user21766269

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:12:24