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

Python爬取多页HTML表格到CSV时数据重复、格式异常求助

葡萄牙语音节划分网站爬虫CSV格式异常修复

问题背景

要从指定葡萄牙语门户网站爬取rollovertable表格里的Palavra和Divisão Silábica列数据,按A-Z遍历所有字母、每页翻页步长100,保存为逗号分隔的CSV,但出现两个问题:

  • CSV的逗号分隔失效,格式混乱
  • 正常数据之间夹杂大量重复或无关的表格内容(比如a-pedido和a-propósito之间混入冗余数据)

常见问题点与修复方案

1. 翻页迭代逻辑出错

如果循环没判断页面是否还有有效数据就继续请求,会拉取到空页面或重复页面,导致冗余数据混入。

  • 修复:每次请求后检查表格是否有数据行,没有就终止当前字母的翻页;同时确保A-Z的字母遍历不重复。

2. 表格解析没过滤无关行

目标表格rollovertable可能包含表头、分页栏这类非数据行,直接遍历所有<tr>会把这些无关内容也抓进来。

  • 修复:只提取表格里的有效数据行(跳过表头行),并且只取前两列(对应目标字段)。

3. CSV写入没处理特殊字符

如果数据里有逗号、换行符,直接拼接字符串会破坏CSV格式;不用专用CSV工具也会导致分隔符失效。

  • 修复:用Python自带的csv模块写入,它会自动处理特殊字符的转义,保证格式正确。

修复后的完整代码

import requests
from bs4 import BeautifulSoup
import csv
from string import ascii_uppercase

# 打开CSV文件准备写入,指定UTF-8编码避免乱码
with open('palavras_silabicas.csv', 'w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    # 写入表头
    csv_writer.writerow(['Palavra', 'Divisão Silábica'])

    # 遍历A-Z每个字母
    for char in ascii_uppercase:
        start_num = 0
        while True:
            # 构造当前页的URL
            target_url = f"http://www.portaldalinguaportuguesa.org/index.php?action=syllables&act=list&letter={char}&start={start_num}"
            response = requests.get(target_url)
            response.encoding = 'utf-8'
            soup = BeautifulSoup(response.text, 'html.parser')

            # 定位目标表格
            target_table = soup.find('table', id='rollovertable')
            if not target_table:
                break  # 找不到表格,说明当前字母没有更多数据了

            # 跳过表头行,只取数据行(假设表头是第一行)
            data_rows = target_table.find_all('tr')[1:]
            if not data_rows:
                break  # 没有数据行,终止翻页

            # 遍历每一行提取数据
            for row in data_rows:
                cells = row.find_all('td')
                # 确保当前行有至少两列有效数据
                if len(cells) >= 2:
                    word = cells[0].get_text(strip=True)
                    syllable_split = cells[1].get_text(strip=True)
                    # 用csv写入器写入,自动处理格式问题
                    csv_writer.writerow([word, syllable_split])

            # 如果当前页数据不足100条,说明是最后一页,停止翻页
            if len(data_rows) < 100:
                break
            start_num += 100

核心修复说明

  • 迭代控制:每次翻页后检查数据行数量,不足100就停止当前字母的翻页;找不到表格或数据行直接终止,避免无效请求
  • 精准解析:跳过表头,只提取有两列数据的行,排除分页栏等无关内容
  • 规范写入:用csv.writer处理特殊字符,保证CSV的逗号分隔始终有效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:00:27