Python에서 오류 없이 유니코드를 ASCII로 변환
내 코드는 웹 페이지를 스크랩한 다음 유니코드로 변환합니다.
html = urllib.urlopen(link).read()
html.encode("utf8","ignore")
self.response.out.write(html)
저는 만난지하...UnicodeDecodeError
:
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 507, in __call__
handler.get(*groups)
File "/Users/greg/clounce/main.py", line 55, in get
html.encode("utf8","ignore")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 2818: ordinal not in range(128)
HTML에 유니코드에 대한 잘못된 형식의 시도가 포함되어 있는 것 같습니다.오류가 발생하는 대신 문제의 원인이 되는 코드 바이트를 삭제할 수 있습니까?
>>> u'aあä'.encode('ascii', 'ignore')
'a'
해당 문자 집합을 사용하여 반환되는 문자열을 디코딩합니다.meta
답또 태에그에 가 있습니다.Content-Type
헤더를 입력한 다음 인코딩합니다.
»encode(encoding, errors)
오류에 대한 사용자 지정 처리기를 허용합니다.기본값은 다음과 같습니다.ignore
다음과 같습니다.
>>> u'aあä'.encode('ascii', 'replace')
b'a??'
>>> u'aあä'.encode('ascii', 'xmlcharrefreplace')
b'aあä'
>>> u'aあä'.encode('ascii', 'backslashreplace')
b'a\\u3042\\xe4'
https://docs.python.org/3/library/stdtypes.html#str.encode 을 참조하십시오.
이그나시오 바스케스-아브람스의 대답의 연장선상에서.
>>> u'aあä'.encode('ascii', 'ignore')
'a'
때로는 문자에서 악센트를 제거하고 기본 양식을 인쇄하는 것이 좋습니다.이 작업은 다음을 통해 수행할 수 있습니다.
>>> import unicodedata
>>> unicodedata.normalize('NFKD', u'aあä').encode('ascii', 'ignore')
'aa'
또한 다른 문자(예: 구두점)를 가장 가까운 문자로 변환할 수도 있습니다. 예를 들어 오른쪽 단일 따옴표 유니코드 문자는 인코딩 시 ASCII 아포스트로피로 변환되지 않습니다.
>>> print u'\u2019'
’
>>> unicodedata.name(u'\u2019')
'RIGHT SINGLE QUOTATION MARK'
>>> u'\u2019'.encode('ascii', 'ignore')
''
# Note we get an empty string back
>>> u'\u2019'.replace(u'\u2019', u'\'').encode('ascii', 'ignore')
"'"
이를 달성하기 위한 더 효율적인 방법이 있지만,자세한 내용은 이 질문을 참조하십시오. Python의 "이 유니코드에 가장 적합한 ASCII" 데이터베이스는 어디에 있습니까?
2018 업데이트:
으로 2018년 2월과 같은 압축을 합니다.gzip
(Google, YouTube, Yahoo, Wikipedia, Reddit, Stack Overflow 및 Stack Exchange Network 사이트와 같은 대형 사이트를 포함하여 모든 웹 사이트의 약 73%가 이 사이트를 사용합니다.)
원래 답변과 같이 gzip 응답으로 간단한 디코딩을 수행하면 다음과 같은 오류가 발생합니다.
UnicodeDecodeError: 'utf8' 코덱이 위치 1에서 바이트 0x8b를 디코딩할 수 없음: 예기치 않은 코드 바이트
gzpiped 응답을 디코딩하려면 다음 모듈(Python 3)을 추가해야 합니다.
import gzip
import io
참고: 2에서는 Python 2를 합니다.StringIO
에 io
그런 다음 다음 내용을 구문 분석할 수 있습니다.
response = urlopen("https://example.com/gzipped-ressource")
buffer = io.BytesIO(response.read()) # Use StringIO.StringIO(response.read()) in Python 2
gzipped_file = gzip.GzipFile(fileobj=buffer)
decoded = gzipped_file.read()
content = decoded.decode("utf-8") # Replace utf-8 with the source encoding of your requested resource
이 코드는 응답을 읽고 버퍼에 바이트를 배치합니다. 그gzip
다음 모듈은 를 "" "" "" "" ""로.GZipFile
. 후에, 로 읽을 수 있고, 정상적으로 수 수 .그런 다음, gzipped 파일을 다시 바이트로 읽고, 일반적으로 읽을 수 있는 텍스트로 디코딩할 수 있습니다.
2010년 원본 답변:
다음에 사용되는 실제 값을 얻을 수 있습니까?link
?
게다가, 우리는 보통 우리가 시도할 때 여기서 이 문제를 접합니다..encode()
이미 인코딩된 바이트 문자열입니다.그래서 당신은 먼저 그것을 해독하려고 시도할 수 있습니다.
html = urllib.urlopen(link).read()
unicode_str = html.decode(<source encoding>)
encoded_str = unicode_str.encode("utf8")
예를 들어,
html = '\xa0'
encoded_str = html.encode("utf8")
실패:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)
시간:
html = '\xa0'
decoded_str = html.decode("windows-1252")
encoded_str = decoded_str.encode("utf8")
오류 없이 성공합니다."Windows-1252"는 예로 사용한 것입니다.나는 이것을 Chardet에서 얻었고 그것은 그것이 옳다는 0.5 자신감을 가지고 있었습니다! (음, 1자 길이의 문자열과 함께 주어진 것처럼, 당신은 무엇을 기대합니까?) 당신은 그것을 반환된 바이트 문자열의 인코딩으로 바꿔야 합니다..urlopen().read()
검색한 콘텐츠에 적용되는 항목을 선택합니다.
내가 거기서 보는 또 다른 문제는.encode()
place를 . string은 source를 수정하지 않습니다.그래서 그것을 갖는 것은 쓸모없는 것입니다.self.response.out.write(html)
html은 html.dll의 인코딩된 문자열이 아니기 때문에(만약 당신이 원래 목표로 했다면).
제안대로 Ignacio에서 반환된 웹 하십시오.read()
은 메타 중 내용에 하 또 있 습 내 용 니 다 는 태 중 나 그 니응답에 헤더를 입력합니다.에 다에대한매사용니다합변수로개음▁▁parameter다니의 매개변수로 사용합니다..decode()
.
그러나 헤더 및/또는 메타 문자 집합 선언이 실제 내용과 일치하는지 확인하기에 충분한 책임이 다른 개발자에게 있다고 가정해서는 안 됩니다.(그것은 피타입니다, 네, 저는 알아야 합니다, 저는 전에 그런 사람들 중 한 명이었습니다.)
유니코드를 사용하세요 - 그것은 심지어 이상한 문자를 즉시 아스키로 변환하고, 심지어 중국어를 음성 아스키로 변환합니다.
$ pip install unidecode
그러면:
>>> from unidecode import unidecode
>>> unidecode(u'北京')
'Bei Jing'
>>> unidecode(u'Škoda')
'Skoda'
저는 모든 프로젝트에서 이 도우미 기능을 사용합니다.유니코드를 변환할 수 없으면 무시합니다.이것은 장고 도서관과 연결되어 있지만, 약간의 조사를 통해 당신은 그것을 우회할 수 있습니다.
from django.utils import encoding
def convert_unicode_to_string(x):
"""
>>> convert_unicode_to_string(u'ni\xf1era')
'niera'
"""
return encoding.smart_str(x, encoding='ascii', errors='ignore')
이것을 사용하면 유니코드 오류가 더 이상 발생하지 않습니다.
고난콘 경같우이와솔과 같은 할 수 .cmd.exe
항상 사용할 수 있는 HTML 출력:
my_unicode_string.encode('ascii','xmlcharrefreplace')
이렇게 하면 ASCII가 아닌 모든 문자가 보존되는 동시에 순수 ASCII 및 HTML로 인쇄할 수 있습니다.
경고:오류를 방지하기 위해 프로덕션 코드에서 이 기능을 사용하는 경우 코드에 문제가 있을 가능성이 높습니다.이것에 대한 유일한 유효한 사용 사례는 비 유니코드 콘솔로 인쇄하거나 HTML 컨텍스트에서 HTML 엔티티로 쉽게 변환하는 것입니다.
마지막으로 Windows에서 cmd.exe를 사용하는 경우 다음과 같이 입력할 수 있습니다.chcp 65001
utf-8 출력을 활성화합니다(루시다 콘솔 글꼴과 함께 작동).추가해야 할 수도 있습니다.myUnicodeString.encode('utf8')
.
당신은 ""라고 썼습니다. 그것은 HTML이 어딘가에 잘못된 유니코드 시도를 포함하고 있다는 것을 의미한다고 생각합니다."""
HTML은 올바른 형식이든 아니든 "unicode 시도"를 포함하지 않을 것으로 예상됩니다.일부 인코딩으로 인코딩된 유니코드 문자를 포함해야 합니다. 일반적으로 먼저 제공됩니다."문자 집합"을 찾습니다.
문자 집합이 UTF-8이라고 가정하는 것 같습니다.어떤 근거로?오류 메시지에 표시된 "\xA0" 바이트는 cp1252와 같은 단일 바이트 문자가 있을 수 있음을 나타냅니다.
HTML의 시작 부분에서 선언을 이해할 수 없다면 chardet을 사용하여 인코딩이 무엇인지 알아 보십시오.
왜 당신은 당신의 질문에 "regex"를 태그했습니까?
전체 질문을 비질문으로 바꾼 후 업데이트:
html = urllib.urlopen(link).read()
# html refers to a str object. To get unicode, you need to find out
# how it is encoded, and decode it.
html.encode("utf8","ignore")
# problem 1: will fail because html is a str object;
# encode works on unicode objects so Python tries to decode it using
# 'ascii' and fails
# problem 2: even if it worked, the result will be ignored; it doesn't
# update html in situ, it returns a function result.
# problem 3: "ignore" with UTF-n: any valid unicode object
# should be encodable in UTF-n; error implies end of the world,
# don't try to ignore it. Don't just whack in "ignore" willy-nilly,
# put it in only with a comment explaining your very cogent reasons for doing so.
# "ignore" with most other encodings: error implies that you are mistaken
# in your choice of encoding -- same advice as for UTF-n :-)
# "ignore" with decode latin1 aka iso-8859-1: error implies end of the world.
# Irrespective of error or not, you are probably mistaken
# (needing e.g. cp1252 or even cp850 instead) ;-)
이 line
은 수있다니습사를 할 수 ..encode([encoding], [errors='strict'])
인코딩 형식을 변환하는 문자열의 메서드입니다.
line = 'my big string'
line.encode('ascii', 'ignore')
Python에서 ASCII와 유니코드를 다루는 것에 대한 더 많은 정보를 원하시면, 이것은 정말 유용한 사이트입니다: https://docs.python.org/2/howto/unicode.html
제 생각에 답은 거기에 있지만 단편적으로만 있기 때문에 다음과 같은 문제를 신속하게 해결하기 어렵습니다.
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 2818: ordinal not in range(128)
예를 들어, 다음 형식(아스키 문자 및 비아스키 문자 포함)의 데이터가 있는 파일이 있다고 가정합니다.
1/10/17, 21:36 - 육지: 환영합니다
그리고 우리는 아스키 문자만 무시하고 보존하기를 원합니다.
이 코드는 다음을 수행합니다.
import unicodedata
fp = open(<FILENAME>)
for line in fp:
rline = line.strip()
rline = unicode(rline, "utf-8")
rline = unicodedata.normalize('NFKD', rline).encode('ascii','ignore')
if len(rline) != 0:
print rline
그리고 type(rline)이 당신에게 줄 것입니다.
>type(rline)
<type 'str'>
unicodestring = '\xa0'
decoded_str = unicodestring.decode("windows-1252")
encoded_str = decoded_str.encode('ascii', 'ignore')
내게 적합함
다음 코드를 예로 사용하여 유니코드에서 ASCII로의 오류를 방지할 수 있습니다.
from anyascii import anyascii
content = "Base Rent for – CC# 2100 Acct# 8410: $41,667.00 – PO – Lines - for Feb to Dec to receive monthly"
content = anyascii(content)
print(content)
Python 2.x를 사용하는 것 같습니다. Python 2.x는 기본적으로 ascii로 설정되며 유니코드에 대해 알지 못합니다.따라서 예외입니다.
쉐뱅 후에 아래 라인만 붙여주시면 됩니다.
# -*- coding: utf-8 -*-
언급URL : https://stackoverflow.com/questions/2365411/convert-unicode-to-ascii-without-errors-in-python
'programing' 카테고리의 다른 글
dplyr을 사용하여 각 그룹에서 최대값이 있는 행을 선택하는 방법은 무엇입니까? (0) | 2023.06.06 |
---|---|
numpy dot()와 Python 3.5+ 행렬 곱셈의 차이 @ (0) | 2023.06.06 |
특정 폴더의 파일 이름이 데이터베이스 테이블 안에 있는지 확인하는 방법은 무엇입니까? (0) | 2023.06.06 |
levels<->(이게 무슨 주술입니까? (0) | 2023.06.06 |
MySQL: 두 필드를 결합하여 쿼리의 날짜/시간 필드 출력 (0) | 2023.06.06 |