我从互联网上抓取一张桌子并保存为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)
答案 0 :(得分: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])
答案 1 :(得分:0)
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
构造:
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)