1

私はPythonに非常に慣れていないため、この投稿が適切に書かれていない場合は、事前に謝罪してください。私がPython3とBeautifulSoupで抱えている非常に単純で愚かな問題。各行には複数のソースからの生データが含まれているため、各行のエンコーディングに何が含まれるかを知らずに、Python で CSV ファイルを解析しようとしています。ファイルを解析する前に、ファイルをクリーンアップするために BeautifulSoup を使用しています (これが良いアイデアかどうかはわかりません)。

from bs4 import BeautifulSoup

def main():
try:
    soup = BeautifulSoup(open('files/sdk_breakout_1027.csv'))

except Exception as e:
    print(str(e))

ただし、これを実行すると、次のエラーが発生します。

'ascii' コーデックは位置 287 のバイト 0xed をデコードできません: 序数が範囲内にありません (128)

私のトレースバックは、問題の原因として CSV の次の行を示しています。

500i(i£ : Android OS : 4.0.4

これについてもっと良い方法は何ですか?この CSV のすべての行を均一なエンコーディングに変換して、後で解析できるようにしたいだけです。

ご協力いただきありがとうございます。

4

2 に答える 2

0

BeautifulSoup で CSV ファイルを解析することはできません。HTML または XML のみです。

BeautifulSoup からの文字セット推測を単独で使用したい場合は、それが可能です。ドキュメントのUnicode, Dammitセクションを参照してください。使用された可能性のあるすべてのエンコーディングの完全なリストがあり、そのリストのどれが実際に使用されたかがわからない場合は、そのリストを Dammit に渡してください。

chardetあなたも試してみたいかもしれない別の文字セット推測ライブラリがあります。(Dammit は chardet がインストールされていれば使用するので、個別に試す必要はないことに注意してください。)

しかし、これらはどちらも知識に基づいた推測にすぎません。ドキュメントには、失敗する可能性のある無数の方法がすべて説明されています。

また、各行が別々にエンコードされている場合 (これは通常よりもさらに大きな混乱です)、あたかも別のファイルであるかのように、各行を Dammit または chardet する必要があります。処理するテキストがはるかに少ないため、推測の精度は大幅に低下しますが、各行が実際に異なるエンコーディングである可能性がある場合、それについてできることは何もありません。

すべてをまとめると、次のようになります。

encodings = 'utf-8', 'latin-1', 'cp1252', 'shift-jis'

def dammitize(f):
    for line in f:
        yield UnicodeDammit(line, encodings).unicode_markup

with open('foo.csv', 'rb') as f:
    for row in csv.reader(dammitize(f)):
        do_something_with(row)
于 2013-11-12T05:56:10.540 に答える