Python错误“;序号不在范围内“;带着口音

Python错误“;序号不在范围内“;带着口音,python,Python,我正在从互联网上抓取一张桌子并保存为CSV文件。文本中有带法语重音的字符,导致保存时出现unicode错误: UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128) 我想找到一个优雅的解决方案来保存重音字符,我可以适用于任何情况。我有时会使用以下方法: encode('ascii','ignore') 但这一次不起作用,原因不明。我还试图替换单

我正在从互联网上抓取一张桌子并保存为CSV文件。文本中有带法语重音的字符,导致保存时出现unicode错误:

 UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
我想找到一个优雅的解决方案来保存重音字符,我可以适用于任何情况。我有时会使用以下方法:

 encode('ascii','ignore')
但这一次不起作用,原因不明。我还试图替换单元格中的
标记,因此我首先使用
str()
转换它

以下是我代码的相关部分:

 data = [
      str(td[0]).split('<sup')[0].split('>')[1].split('<')[0],
      td[1].getText()
 ]
 output.append(data)

 csv_file = csv.writer(open('savedFile.csv', 'w'), delimiter=',')

 for line in output:
      csv_file.writerow(line)
数据=[

str(td[0]).split(“”)[1]。split(“”如果
td[0]
u“abc”

td[0]。拆分(“”)[2]。拆分(“”)+1:
u“c”

如果这种字符串索引和匹配太简单,可以考虑创建正则表达式,并将其与HTML标记中的文本匹配:

import re
r = re.compile("[^<]*<sup>([^<]*)</sup>")
m = r.match("some<sup>text</sup>")
print(m.groups()[0])
重新导入
r=re.compile(“[^The
csv.reader()
csv.writer()
需要以二进制模式打开文件。您还应该在最后关闭文件。因此,您应该像这样编写它:

f = open('output.csv', 'wb')
writer = csv.writer(f, delimiter=',')

for row in output:
    writer.writerow(row)

f.close()
或者,在使用较新版本的Python时,可以将
构造一起使用:

with open('output.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=',')

    for row in output:
        writer.writerow(row)
…文件将自动关闭

无论如何,csv.writer()需要由字节序列(而不是Unicode字符串)组成的行。如果您有Unicode字符串,请使用.encode('utf-8')转换它们:


如果您想要Unicode,请不要使用
'ascii'
编解码器。我对它的编码方式并不挑剔,我只需要保存它而不会出错。编码到
ascii
以前已经解决了这个问题,但这一次不行。
ascii
编解码器无法编码基本ascii表中128个字符以外的任何内容。这是默认的n python 2.x。它无法解决问题,它试图掩盖问题(
'ignore'
)。有时这会在掩盖下留下一个可见的肿块(您的错误)相反,请正确操作;如果您想要Unicode,请使用Unicode编码。我同意这是一个bandaid解决方案。但是,我如何使用Unicode编码?问题是
.getText()
剥离HTML标记,包括
,因此
中的值仍然存在。如果我可以以另一种方式剥离HTML标记,所有内容都将保持unicode格式,不会产生错误。我非常感谢您提供的帮助,但仍然返回相同的错误。也许我应该发布完整的代码,看看是否有错误同时,保存到JSON很好,因为我收集的是,它不需要Unicode。那么,您是否使用Unicode字符串?或者更好地问一下(当您调用
str()
,您使用的是Python3还是Python2。如果是Python2,您根本不应该将.encode()作为
str()调用)
不返回Unicode字符串。删除对
str()
.getText()
的所有引用可防止显示错误。我可能应该尝试使用其他方法剥离HTML标记。感谢您的帮助。
    for row in output:
        encoded_row = [s.encode('utf-8') for s in row]
        writer.writerow(encoded_row)