UnicodeEncodeError:'ascii' 编解码器无法在位置 6 编码字符 u'\u2019':序数不在范围内(128)

Posted

技术标签:

【中文标题】UnicodeEncodeError:\'ascii\' 编解码器无法在位置 6 编码字符 u\'\\u2019\':序数不在范围内(128)【英文标题】:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 6: ordinal not in range(128)UnicodeEncodeError:'ascii' 编解码器无法在位置 6 编码字符 u'\u2019':序数不在范围内(128) 【发布时间】:2017-03-29 21:59:10 【问题描述】:

我正在尝试从 TripAdvisor 中提取阿姆斯特丹 500 家餐厅的列表;但是在第 308 家餐厅之后,我收到以下错误:

Traceback (most recent call last):
  File "C:/Users/dtrinh/PycharmProjects/TripAdvisorData/LinkPull-HK.py", line 43, in <module>
    writer.writerow(rest_array)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 6: ordinal not in range(128)

我尝试了一些在 *** 上找到的东西,但目前没有任何效果。我想知道是否有人可以查看我的代码并查看任何可能很棒的解决方案。

        for item in soup2.findAll('div', attrs='class', 'title'):
            if 'Cuisine' in item.text:
                item.text.strip()
                content = item.findNext('div', attrs=('class', 'content'))
                cuisine_type = content.text.encode('utf8', 'ignore').strip().split(r'\xa0')
        rest_array = [account_name, rest_address, postcode, phonenumber, cuisine_type]
        #print rest_array
        with open('ListingsPull-Amsterdam.csv', 'a') as file:
                writer = csv.writer(file)
                writer.writerow(rest_array)
    break

【问题讨论】:

cuisine_type 是一个列表,因为您使用 .split (我不确定您为什么要在不间断空格上拆分...)。但是,传递给.writerow 的行的内容必须是字符串或数字。此外,当使用 Python 2 csv 模块时,您应该以二进制模式打开 CSV 文件,如 the docs 中所述。您可能会发现这篇文章很有帮助:Pragmatic Unicode,由 SO 资深人士 Ned Batchelder 撰写。 【参考方案1】:

rest_array 包含 unicode 字符串。当您使用csv.writer 写入行时,您需要序列化字节字符串(您使用的是 Python 2.7)。

我建议你使用“utf8”编码:

with open('ListingsPull-Amsterdam.csv', mode='a') as fd:
    writer = csv.writer(fd)
    rest_array = [text.encode("utf8") for text in rest_array]
    writer.writerow(rest_array)

注意:请不要使用 file 作为变量,因为你会隐藏内置函数 file()open() 函数的别名)。

如果您想用 Microsoft Excel 打开这个 CSV 文件,您可以考虑使用其他编码,例如“cp1252”(它允许 u"\u2019" 字符)。

【讨论】:

【参考方案2】:

您正在将非 ascii 字符写入 csv 输出文件。确保使用允许对字符进行编码的适当字符编码打开输出文件。一个安全的选择通常是 UTF-8。试试这个:

with open('ListingsPull-Amsterdam.csv', 'a', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(rest_array)

edit这是针对 Python 3.x 的,抱歉。

【讨论】:

我认为他在 Python 3 上不会出现这个错误。他的问题被标记为python-2.7【参考方案3】:

在脚本开头添加这些行

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

【讨论】:

以上是关于UnicodeEncodeError:'ascii' 编解码器无法在位置 6 编码字符 u'\u2019':序数不在范围内(128)的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2026'

UnicodeEncodeError: 'ascii' 编解码器无法编码字符 u'\u2013'

UnicodeEncodeError:'ascii'编解码器无法对特殊名称的字符进行编码[重复]

UnicodeEncodeError:'ascii' 编解码器无法在位置 0 编码字符 u'\xef':序数不在范围内(128)

UnicodeEncodeError:'ascii'编解码器无法在位置 3 编码字符 u'\ufffd':序数不在范围内(128)[重复]

UnicodeEncodeError:“ascii”编解码器无法在位置 126 编码字符 u'\u2019':序数不在范围内(128)