「UnicodeEncodeError: 'ascii'コーデックは文字をエンコードできません」
-
22-07-2019 - |
質問
正規表現を介してランダムな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()
解決
バイト文字列を何かに渡そうとしているが、(あなたが提供する情報の不足から)あなたがそれを渡そうとしている何を伝えることは不可能である。 ASCII(デフォルトコーデック)としてエンコードできないUnicode文字列から開始するため、いくつかの異なるコーデックでエンコードする必要があります(または@ R.Pateが示唆するように文字変換する必要があります)使用する必要がある what コーデックと言います。これは、バイト文字列を渡すものがわからないため、未知のサブシステムが次の点で正しく受け入れて処理できるものがわからないためです。コーデック。
あなたが私たちを置いているような完全な暗闇では、 utf-8
は合理的な盲目的推測です(これは、Unicode文字列をバイト文字列として正確に表現できるコーデックであり、 XMLなどの多くの目的)-しかし、そのバイト文字列を渡そうとしている what について詳しく説明するまで、盲目的な推測にすぎませんへ、そしてどんな目的のために。
裸の thestring
ではなく、 thestring.encode( 'utf-8')
を渡すことで、今見ている特定のエラーを確実に回避できますが、受信者がutf-8エンコードを受け入れる準備ができており、喜んで受け入れられない限り(そして、どうやって知ることができるか、絶対にゼロである場合を除いて、そのバイト文字列でやろうとしている 独特の表示)受信者がおそらく何であるかについての考え?!-)
他のヒント
" 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
「最高の」方法は常に要件に依存します。それで、あなたのものは何ですか?非ASCIIを無視することは適切ですか? ™を"(tm)"に置き換えますか? (この例では派手に見えますが、他のコードポイントではすぐに壊れます。しかし、それはまさにあなたが望むものかもしれません。)例外はまさにあなたが必要とするものかもしれません。今、あなたはそれを何らかの方法で処理する必要がありますか?
この質問に本当に答えることができるのはあなただけです。
まず、英語(または必要に応じて他の言語)の翻訳をインストールしてみてください:
sudo apt-get install language-pack-en
サポートされているすべてのパッケージ(Pythonを含む)の翻訳データの更新を提供します。
そして、コードで正しいエンコーディングを使用していることを確認してください。
例:
open(foo, encoding='utf-8')
次に、 LANG
の値やロケールの構成( / etc / default / locale
)などのシステム構成を再確認し、セッションの再ログインを忘れないでください。