【问题标题】:Avoiding UnicodeEncodeError in python在 python 中避免 UnicodeEncodeError
【发布时间】:2018-07-13 15:12:58
【问题描述】:

我尝试使用带有以下脚本的 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 文件,没有编码问题。 在 Enrico Tröger 的 Geany 之前一切都很好。我的脚本无法写入ö 进入一个csv文件,所以我尝试了这个: csvRow.append(cell.text.encode('ascii', 'replace')) 而不是:csvRow.append(cell.getText()) 一切都很好,尽管每个表格单元都嵌套在b'' 中。 那么,我怎样才能得到一个没有编码问题的格式清晰的 csv 文件(如第一个屏幕截图)并替换或忽略所有 使用我的 scipt 的非 unicode 符号(如第二个屏幕截图)?

【问题讨论】:

  • 您能否将带有UnicodeDecodeError 的完整错误回溯添加到问题中?

标签: python csv unicode


【解决方案1】:

换一个:

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()

希望对你有帮助!

【讨论】:

  • 那行得通,但我需要将csvRow.append(cell.text.encode('ascii', 'replace') 替换为csvRow.append(cell.getText())
【解决方案2】:

看起来 csv 模块需要字符串,而不是 bytes。因此,您可以在传递 bytes 之前对其进行解码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多