使用csvwriter和urllib进行Python编码

使用csvwriter和urllib进行Python编码,python,csv,encoding,Python,Csv,Encoding,我知道这里的bucketload也回答了类似的问题,但没有一种方法能真正解决我的问题 我想做的是: 我从网页中获取大量数据,并用Python解析它们,然后将结果写入CSV文件 我现在使用的代码类似于: with urllib.request.urlopen('http://xxxxxx.com.br/') as response: soup = BeautifulSoup(response.read().decode('utf-8','replace'), 'html.parser') #lo

我知道这里的bucketload也回答了类似的问题,但没有一种方法能真正解决我的问题

我想做的是:

我从网页中获取大量数据,并用Python解析它们,然后将结果写入CSV文件

我现在使用的代码类似于:

with urllib.request.urlopen('http://xxxxxx.com.br/') as response:
soup = BeautifulSoup(response.read().decode('utf-8','replace'), 'html.parser')

#lots of parsing here

with open('exit.csv', 'w', newline='') as csvfile:
    exit_writer = csv.writer(csvfile, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for cat in categories:
        exit_writer.writerow([a.encode('utf-8') for a in cat])
代码将运行,但它将始终以b'开头单元格/字符串,所有特殊字符将替换为\xe2\x80\x93之类的代码

我做错了什么?我怎样才能永远解决这个问题


谢谢

“替换”是什么意思?如果对em破折号u'-'进行编码
u+2013
,则会得到UTF-8字节
\xe2\x80\x93
。这不正是你在最后一行问的吗?你能不能给出一个全面的例子,说明什么看起来是错的,什么应该是错的?@9000一个例子:一个单元格应该读“Bacharel em relações internacionais”,而不是读“b'Bacharel em rela\xc3\xa7\xc3\xb5es internacionais”,这是我加的双引号。我知道这是由TestRing编码的utf-8,但如果我不在最后一行代码中执行“a.encode('utf-8'),我会遇到那些著名的“映射到未定义的”错误。看起来你在某处调用
repr
,或者传递一个以这种方式插值的对象,而不是从中获取字符串值。例如,您确定总是从BeautifulSoup对象中提取文本,而不将节点传递给输出吗?我会添加一堆打印语句,然后看看哪里出现了错误的表示。