1

データベースをループして、文字列に対して美しいスープ処理を実行し、テキストを他のテキストに置き換えるなどのスクリプトがあります。

これはほとんどの場合100%機能しますが、一部のhtml blobには、次のエラーでスクリプトを壊すユニコードテキストが含まれているようです。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 112: ordinal not in range(128)

この場合の対処方法がわかりません。文字列内のすべてのテキストを標準化されたutf-8などにするモジュール/関数を知っている人はいますか?

データベース内のすべてのhtmlblobは、feedparser(rssフィードのダウンロード、dbへの保存)から取得されました。

4

4 に答える 4

1

あなたは私たちにあなたのコードを見せたくないので、うまくいけばあなたが問題を見つけるのを助ける一般的な答えを与えるつもりです。

最初にデータベースからデータを取得し、を使用してデータをフェッチするときは、データをオブジェクトfetchoneに変換する必要がありunicodeます。変数を取得したらすぐにこれを実行し、出力したときにのみ再エンコードすることをお勧めします。

db = MySQLdb.connect()
cur = db.cursor()
cur.execute("SELECT col FROM the_table LIMIT 10")
xml = cur.fetchone()[0].decode('utf-8') # Or whatever encoding the text is in, though we're pretty sure it's utf-8. You might use chardet

を実行xmlした後、ファイルに保存されている場合は文字列を再度表示するBeautifulSoupencode、データベースに再挿入する場合は文字列をUnicodeオブジェクトのままにしておくことができます。

于 2013-01-12T13:50:07.297 に答える
1

UnicodeUTF-8の違いが何であるか、そしてそれが同じではないことを本当に理解していることを確認してください(多くの人にとっては驚きです)。これは、すべてのソフトウェア開発者がUnicodeと文字セットについて絶対に、積極的に知っている必要がある絶対的な最小値です。

DBのエンコーディングは何ですか?本当にUTF-8なのか、それともそうだと思っているだけなの。ランダムにエンコードされたblobが含まれている場合は、エンコードを推測できないため、問題が発生します。データベースから読み取るときはdecode、blobをユニコードに変換し、コードの後半でユニコードを使用します。

ただし、ベースがUTF-8であると仮定します。次に、どこでもユニコードを使用する必要があります-早くデコードし、遅くエンコードします。プログラム内のあらゆる場所でUnicodeを使用し、データベースからの読み取りまたはデータベースへの書き込み、表示、ファイルへの書き込みなどの場合にのみデコード/エンコードします。

UnicodeとエンコーディングはPython2.xでは少し面倒ですが、幸いPython3ではすべてのテキストがUnicodeです

BeautifulSoupについては、最新バージョン4を使用してください。

于 2013-01-12T13:55:45.303 に答える
1

さらに数時間グーグルした後、私はついにすべてのデコードエラーを排除する解決策に出くわしました。私はまだPython(重いphpの背景)にかなり慣れておらず、文字エンコードを理解していませんでした。

私のコードには.decode('utf-8')があり、その後に.replace(str(beatiful_soup_tag)、'')ステートメントがいくつかありました。解決策は、すべてのstr()をunicode()に変更するほど単純なものになりました。その後、単一の問題ではありません。

回答は次の場所にあります:http: //ubuntuforums.org/showthread.php?t = 1212933

コードの投稿をリクエストしてくれたコメント投稿者に心からお詫びします。私が思ったのは堅実で、問題はまったく逆で、彼らはすぐに問題を見つけたと確信しています。二度とその間違いを犯さない!:)

于 2013-01-12T16:52:23.940 に答える
1

文字列変数を使用してさらに処理を行う前に:

clean_str = unicode(str_var_with_strange_coding, errors='ignore')

混乱した文字はスキップされます。おそらく意味のある値を復元しようとしないため、エレガントではありませんが、効果的です。

于 2013-01-12T17:07:19.980 に答える