27

正規表現を使用してランダムな html の大きな文字列を渡そうとしていますが、Python 2.6 スクリプトがこれを詰まらせています。

UnicodeEncodeError: 'ascii' コーデックは文字をエンコードできません

私はそれを、この単語の末尾にあるトレードマークの上付き文字である Protection™ にまでさかのぼりました。そして、このようなものに将来遭遇することを期待しています。

非ASCII文字を処理するモジュールはありますか? または、PythonでASCII以外のものを処理/エスケープする最良の方法は何ですか?

ありがとう!完全なエラー:

E
======================================================================
ERROR: test_untitled (__main__.Untitled)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\Test2.py", line 26, in test_untitled
    ofile.write(Whois + '\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 1005: ordinal not in range(128)

完全なスクリプト:

from selenium import selenium
import unittest, time, re, csv, logging

class Untitled(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox", "http://www.BaseDomain.com/")
        self.selenium.start()
        self.selenium.set_timeout("90000")

    def test_untitled(self):
        sel = self.selenium
        spamReader = csv.reader(open('SubDomainList.csv', 'rb'))
        for row in spamReader:
            sel.open(row[0])
            time.sleep(10)
            Test = sel.get_text("//html/body/div/table/tbody/tr/td/form/div/table/tbody/tr[7]/td")
            Test = Test.replace(",","")
            Test = Test.replace("\n", "")
            ofile = open('TestOut.csv', 'ab')
            ofile.write(Test + '\n')
            ofile.close()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()
4

4 に答える 4

32

「strict」モードで Unicode を ascii に変換しようとしています:

>>> help(str.encode)
Help on method_descriptor:

encode(...)
    S.encode([encoding[,errors]]) -> object

    Encodes S using the codec registered for encoding. encoding defaults
    to the default encoding. errors may be given to set a different error
    handling scheme. Default is 'strict' meaning that encoding errors raise
    a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
    'xmlcharrefreplace' as well as any other name registered with
    codecs.register_error that is able to handle UnicodeEncodeErrors.

おそらく、次のいずれかのようなものが必要です。

s = u'Protection™'

print s.encode('ascii', 'ignore')    # removes the ™
print s.encode('ascii', 'replace')   # replaces with ?
print s.encode('ascii','xmlcharrefreplace') # turn into xml entities
print s.encode('ascii', 'strict')    # throw UnicodeEncodeErrors
于 2009-10-31T00:58:40.527 に答える
22

バイト文字列を何かに渡そうとしていますが、(提供する情報の不足から)何に渡そうとしているかを伝えることは不可能です。ASCII(デフォルトのコーデック)としてエンコードできないUnicode文字列から始めるため、別のコーデックでエンコードする(または@R.Pateが示唆するように音訳する)必要がありますが、使用することは不可能です使用するコーデックを教えてください。これは、バイト文字列に何を渡すかわからないため、未知のサブシステムがコーデックに関して何を受け入れて正しく処理できるかがわからないためです

あなたが私たちを置き去りにしたような完全な暗闇の中でutf-8、合理的な盲目的な推測です(これは、Unicode文字列をバイト文字列として正確に表すことができるコーデックであり、XMLなどの多くの目的のための標準コーデックであるため)-しかし、それは可能です.そのバイト文字列をに渡そうとしているか、またその目的について詳しく教えていただけない限り、盲目的な推測にすぎません。

thestring.encode('utf-8')そのままではなく渡すことでthestring、現在表示されている特定のエラーを確実に回避できますが、受信者が準備ができていて、喜んで、できる場合を除き、奇妙な表示 (またはそのバイト文字列で何をしようとしているのか)発生する可能性があります。 utf-8エンコーディングを受け入れます(そして、受信者が何であるかについてまったく考えていないので、どうすれば知ることができますか?!-)

于 2009-10-31T01:12:21.430 に答える
1

「最良の」方法は、常に要件によって異なります。それで、あなたは何ですか?非 ASCII を無視することは適切ですか? ™ を "(tm)" に置き換えますか? (この例では派手に見えますが、他のコードポイントではすぐに分解されますが、それはまさにあなたが望むものかもしれません.) 例外はまさにあなたが必要としているものである可能性があります. 今、あなたはそれを何らかの方法で処理する必要がありますか?

この質問に本当に答えられるのはあなただけです。

于 2009-10-31T00:31:55.477 に答える
0

まず、英語 (または必要に応じて他の言語) の翻訳をインストールしてみてください。

sudo apt-get install language-pack-en

サポートされているすべてのパッケージ (Python を含む) の翻訳データの更新を提供します。

また、コードで正しいエンコーディングを使用していることを確認してください。

例えば:

open(foo, encoding='utf-8')

次にLANG、ロケール ( /etc/default/locale) の値や構成などのシステム構成を再確認し、セッションに再ログインすることを忘れないでください。

于 2015-08-13T12:11:57.910 に答える