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
相关产品推荐
相关产品推荐

