0

我正在从 Internet 上抓取一张表格并保存为 CSV 文件。文本中有带法语口音的字符,导致保存时出现 unicode 错误:

 UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)

我想找到一个优雅的解决方案来保存可以应用于任何情况的重音字符。我有时使用以下内容:

 encode('ascii','ignore')

但这一次它不起作用,原因不明。我也在尝试替换<sup>单元格中的标签,所以我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)
4

2 回答 2

0

如果td[0]u"a<sup>b</sup>c"

td[0].split('<sup')u"a"

td[0].partition('>')[2].split('<')[0]u"b"

td[0][td[0].rindex('>') + 1:]u"c"

如果这种字符串索引和匹配过于简单,您可以考虑创建一个正则表达式并将其与 html 标记中的文本进行匹配:

import re
r = re.compile("[^<]*<sup>([^<]*)</sup>")
m = r.match("some<sup>text</sup>")
print(m.groups()[0])
于 2012-04-25T19:16:23.130 回答
0

csv.reader()csv.writer()要求以二进制模式打开的文件。您还应该在最后关闭文件。因此,你应该这样写:

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

for row in output:
    writer.writerow(row)

f.close()

或者,您可以with在使用较新版本的 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') 进行转换:

    for row in output:
        encoded_row = [s.encode('utf-8') for s in row]
        writer.writerow(encoded_row)
于 2012-04-25T20:39:54.080 回答