如何用Python将网站爬取内容转换为CSV文件?解决‘非UTF-8编码’报错问题
解决CSV编码错误:正确保存巴西国库拍卖数据为UTF-8格式
我来帮你搞定这个编码问题!你遇到的"teste_tesouro.csv is not UTF-8 encoded"错误,本质是巴西国库网站返回的内容并非UTF-8编码(这类拉美地区的网站常用ISO-8859-1或cp1252编码),直接写入二进制内容会导致系统识别编码时异常。下面是具体的解决步骤:
问题根源拆解
你直接把response.content(二进制原始内容)写入文件,没有做编码转换,而系统默认以UTF-8规则识别文件时,就会因编码不匹配报错。网站返回的文本包含葡萄牙语特殊字符,必须先转成UTF-8编码再保存。
解决方案一:直接转码后写入文本文件
最简单的方式是先将响应内容解码为网站的原始编码(这里大概率是ISO-8859-1),再转成UTF-8字符串写入文件:
import requests from bs4 import BeautifulSoup # 你的爬取代码保持不变 response = requests.post('https://sisweb.tesouro.gov.br/apex/wwv_flow.accept', headers=headers, cookies=cookies, data=data) soup = BeautifulSoup(response.content, "html.parser") # 转码:先按网站编码解码,再转换为UTF-8格式 utf8_text = soup.text.encode('ISO-8859-1').decode('utf-8') # 以文本模式写入,明确指定UTF-8编码 with open('teste_tesouro.csv', 'w', encoding='utf-8') as csv_file: csv_file.write(utf8_text)
如果不确定网站的具体编码,可以先打印响应的编码属性确认:
print(response.encoding) # 输出类似ISO-8859-1,这就是网站使用的编码
解决方案二:用csv模块规范处理(推荐)
因为你的数据本身是分号分隔的CSV格式,用Python内置的csv模块处理能避免换行符、分隔符的潜在问题,还能灵活清洗数据(比如跳过开头的说明文字):
import csv from io import StringIO import requests from bs4 import BeautifulSoup response = requests.post('https://sisweb.tesouro.gov.br/apex/wwv_flow.accept', headers=headers, cookies=cookies, data=data) soup = BeautifulSoup(response.content, "html.parser") # 将文本转为可读取的IO对象 text_io = StringIO(soup.text) # 过滤空行,提取所有有效内容行 all_lines = [line.strip() for line in text_io if line.strip()] # 跳过前5行的说明文字(从第6行开始是CSV表头和数据) csv_content = all_lines[5:] # 写入规范的CSV文件 with open('teste_tesouro.csv', 'w', encoding='utf-8', newline='') as csv_file: # 指定分号为分隔符,匹配数据格式 writer = csv.writer(csv_file, delimiter=';') for line in csv_content: # 按分号分割每行数据 row_data = line.split(';') writer.writerow(row_data)
这样处理后,生成的CSV文件就是标准UTF-8编码,不会再出现编码错误,同时数据结构更规范,方便后续分析使用。
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

