문제

정규식을 통해 임의의 HTML로 구성된 큰 문자열을 전달하려고 하는데 Python 2.6 스크립트가 이것으로 인해 질식하고 있습니다.

유니코드인코드오류:'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(기본 코덱)로 인코딩할 수 없는 유니코드 문자열로 시작하므로 다른 코덱으로 인코딩해야 합니다(또는 @R.Pate가 제안한 대로 음역). 말하다 무엇 우리는 바이트열을 전달하는 내용을 모르기 때문에 알 수 없는 하위 시스템이 코덱 측면에서 무엇을 받아들이고 올바르게 처리할 수 있는지 모르기 때문에 사용해야 합니다.

당신이 우리를 내버려두신 그 완전한 어둠 속에서, utf-8 합리적인 블라인드 추측입니다(모든 유니코드 문자열을 정확하게 바이트열로 표현할 수 있는 코덱이고 XML과 같은 다양한 목적을 위한 표준 코덱이므로). 그러나 이는 블라인드 추측에 지나지 않습니다. 그리고 당신이 우리에게 더 많은 것을 말해주지 않는 한 무엇 당신은 그 바이트 스트링을 어떤 목적으로 전달하려고합니다.

통과 thestring.encode('utf-8') 맨발보다는 thestring 지금 보고 있는 특정 오류는 확실히 방지할 수 있지만 이로 인해 이상한 디스플레이(또는 그 어떤 것이든)가 발생할 수 있습니다. ~이다 당신은 그 바이트 스트링으로 작업을 시도하고 있습니다!) 수신자가 utf-8 인코딩을 받아들일 준비가 되어 있지 않고 기꺼이 받아들일 수 없다면 (그리고 수신자가 무엇인지 전혀 모르는데 어떻게 알 수 있습니까?!-)

다른 팁

"엄격한"모드에서 유니 코드를 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

모든 지원되는 패키지 (파이썬 포함)에 대한 번역 데이터 업데이트를 제공합니다.

코드에서 올바른 인코딩을 사용해야합니다.

예를 들어:

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

그런 다음 값과 같은 시스템 구성을 두 번 확인하십시오 LANG 또는 로케일 구성 (/etc/default/locale) 그리고 당신의 세션을 다시 로그인하는 것을 잊지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top