'charmap'코덱이 HTML을 구문 분석하는 동안 Python에서 문자 오류를 인코딩 할 수 없습니다.

산지 트 싱

내 코드는 다음과 같습니다.

dataFile = open('dataFile.html', 'w')
res = requests.get('site/pm=' + str(i))
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
linkElems = soup.select('#content')
dataFile.write(str(linkElems[0]))

다른 코드가 있지만 이것이 문제가 있다고 생각하는 코드입니다. 또한 다음을 사용해 보았습니다.

dataFile.write(str(linkElems[0].decode('utf-8')))

그러나 그것은 작동하지 않고 오류를 제공합니다.

사용 dataFile = open('dataFile.html', 'wb')하면 오류가 발생합니다.

a bytes-like object is required, not 'str'
Martijn Pieters

인코딩을 지정하지 않고 텍스트 파일을 열었습니다.

dataFile = open('dataFile.html', 'w')

이것은 파이썬에게 시스템기본 코덱 을 사용하도록 지시 합니다 . 쓰려고하는 모든 유니 코드 문자열은 해당 코덱으로 인코딩되며 Windows 시스템은 UTF-8을 기본값으로 설정하지 않습니다.

인코딩을 명시 적으로 지정합니다.

dataFile = open('dataFile.html', 'w', encoding='utf8')

다음으로 HTML 데이터가 사용하는 인코딩을 알기 위해 HTTP 서버를 신뢰합니다. 이것은 일반적으로 전혀 설정되지 않으므로 사용하지 마십시오 response.text! 여기서 잘못한 것은 BeautifulSoup이 아니며 Mojibake를 다시 인코딩하고 있습니다 . requests라이브러리는 라틴어-1 인코딩을 기본값으로 text/*그 기본이라는 HTTP 표준 상태에 있기 때문에, 서버가 명시 적으로 인코딩을 지정하지 않는 콘텐츠 형식.

고급 문서인코딩 섹션을 참조하십시오 .

유일한 시간 요청이 명시 적 캐릭터 세트는 HTTP 헤더에 존재하지 않는 경우 이것이하지 않을 Content-Type 헤더가 포함되어 있습니다 text. 이 상황에서 RFC 2616은 기본 문자 집합이이어야 함을 지정합니다ISO-8859-1 . 이 경우 요청은 사양을 따릅니다. 다른 인코딩이 필요한 경우 Response.encoding속성을 수동으로 설정 하거나 raw Response.content.

대담하게 강조합니다.

으로 이동 response.content하는 대신 원시 데이터 :

soup = bs4.BeautifulSoup(res.content, 'html.parser')

BeautifulSoup 4는 일반적으로 HTML <meta>태그 또는 제공된 바이트의 통계 분석 에서 구문 분석 할 때 사용할 올바른 인코딩을 알아내는 데 큰 역할을 합니다. 서버가 문자 집합을 제공하는 경우에도 응답에서 BeautifulSoup으로 전달할 수 있지만 requests기본값을 사용하는 경우 먼저 테스트하십시오 .

encoding = res.encoding if 'charset' in res.headers.get('content-type', '').lower() else None
soup = bs4.BeautifulSoup(res.content, 'html.parser', encoding=encoding)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관