在Python中避免UnicodeEncodeError

时间:2018-07-13 15:12:58

标签: python csv unicode

我尝试使用python和以下脚本将html table解析为csv:

from bs4 import BeautifulSoup
import requests
import csv


csvFile = open('log.csv', 'w', newline='')
writer = csv.writer(csvFile)
def parse():
    html = requests.get('https://en.wikipedia.org/wiki/Comparison_of_text_editors')
    bs = BeautifulSoup(html.text, 'lxml')
    table = bs.select_one('table.wikitable')
    rows = table.select('tr')
    for row in rows:
        csvRow = []
        for cell in row.findAll(['th', 'td']):
            csvRow.append(cell.getText())
        writer.writerow(csvRow)
        print(csvRow)


parse()
csvFile.close()

此代码输出的是格式清晰的CSV文件,没有编码问题。an example 在EnricoTröger的Geany之前一切都很好。我的脚本无法编写ö 到一个csv文件中,所以我尝试了这个: csvRow.append(cell.text.encode('ascii', 'replace'))代替:csvRow.append(cell.getText()) 尽管每个表单元格都嵌套在b''中,但一切都很好。 enter image description here因此,我如何获得格式清晰的csv文件,该文件带有很多编码问题(如第一个屏幕截图所示),并且全部替换或忽略了 非密码符号(如第二个屏幕截图所示)使用我的密码?

2 个答案:

答案 0 :(得分:6)

更改此内容

csvFile = open('log.csv', 'w', newline='')

对此:

csvFile = open('log.csv', 'w', newline='', encoding='utf8')

csv module documentation

  

由于使用open()打开了CSV文件以进行读取,因此默认情况下,将使用系统默认编码将文件解码为unicode(请参见locale.getpreferredencoding())。要使用其他编码对文件进行解码,请使用open的encoding参数:

import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
         print(row)
     

这同样适用于写入系统默认编码以外的内容:打开输出文件时指定编码参数。

我想您的系统默认编码不是utf8。 您可以像这样检查它:

import locale
locale.getpreferredencoding()

希望有帮助!

答案 1 :(得分:1)

好像csv模块需要字符串,而不是bytes。因此,您可以在传递bytes之前对它们进行解编码:

cell.text.encode('ascii', 'replace').decode('ascii')