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}")
关键说明
recursive=False参数:这是解决重复问题的核心。使用该参数后,find_all只会查找当前元素的直接子节点,不会深入到嵌套的<table>标签内部,彻底避免把子表格的行当成主表格的行。- 嵌套表格内容处理:对于包含子表格的单元格,提取其内部所有文本并合并成一个字符串,既保留完整信息,又不会破坏主表格的行结构。
- 主表格定位:示例中通过索引定位主表格,你也可以根据页面特征(比如表格的
id、class,或者相邻的文本内容)更精准地定位,避免索引变化导致的错误。
处理后,主表格的每一行数据都会和参考样式一致,不会再出现重复的行。
内容的提问来源于stack exchange,提问作者user21766269
相关产品推荐
相关产品推荐

