0

インターネットからテーブルをスクレイピングし、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 に答える