아름다운 수프-인코딩

모든 HTML 또는 XML 문서는 ASCII 또는 UTF-8과 같은 특정 인코딩으로 작성됩니다. 그러나 HTML / XML 문서를 BeautifulSoup에로드하면 유니 코드로 변환됩니다.

>>> markup = "<p>I will display £</p>"
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.p
<p>I will display £</p>
>>> Bsoup.p.string
'I will display £'

위의 동작은 BeautifulSoup이 내부적으로 Unicode, Dammit이라는 하위 라이브러리를 사용하여 문서의 인코딩을 감지 한 다음이를 유니 코드로 변환하기 때문입니다.

그러나 항상 유니 코드는 아니지만 Dammit은 올바르게 추측합니다. 인코딩을 추측하기 위해 문서를 바이트 단위로 검색하므로 많은 시간이 걸립니다. 인코딩을 이미 알고있는 경우 BeautifulSoup 생성자에 from_encoding으로 전달하여 시간을 절약하고 실수를 방지 할 수 있습니다.

아래는 BeautifulSoup이 ISO-8859-8 문서를 ISO-8859-7로 잘못 식별 한 예입니다.

>>> markup = b"<h1>\xed\xe5\xec\xf9</h1>"
>>> soup = BeautifulSoup(markup)
>>> soup.h1
<h1>νεμω</h1>
>>> soup.original_encoding
'ISO-8859-7'
>>>

위의 문제를 해결하려면 from_encoding을 사용하여 BeautifulSoup에 전달하십시오.

>>> soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
>>> soup.h1
<h1>ולש </h1>
>>> soup.original_encoding
'iso-8859-8'
>>>

BeautifulSoup 4.4.0에서 추가 된 또 다른 새로운 기능은 exclude_encoding입니다. 올바른 인코딩을 모르지만 Unicode, Dammit이 잘못된 결과를 표시하는 경우 사용할 수 있습니다.

>>> soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])

출력 인코딩

BeautifulSoup의 출력은 BeautifulSoup에 입력 된 문서에 관계없이 UTF-8 문서입니다. ISO-8859-2 형식의 폴란드어 문자가있는 문서 아래.

html_markup = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-2">
</HEAD>
<BODY>
ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
</BODY>
</HTML>
"""


>>> soup = BeautifulSoup(html_markup)
>>> print(soup.prettify())
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
      <meta content="text/html; charset=utf-8" http-equiv="content-type"/>
   </head>
   <body>
      ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
   </body>
</html>

위의 예에서 알 수 있다면 BeautifulSoup에서 생성 된 문서를 반영하도록 <meta> 태그가 다시 작성되어 이제 UTF-8 형식입니다.

UTF-8로 생성 된 출력을 원하지 않는 경우 prettify ()에서 원하는 인코딩을 할당 할 수 있습니다.

>>> print(soup.prettify("latin-1"))
b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n <head>\n <meta content="text/html; charset=latin-1" http-equiv="content-type"/>\n </head>\n <body>\n ą ć ę ł ń \xf3 ś ź ż Ą Ć Ę Ł Ń \xd3 Ś Ź Ż\n </body>\n</html>\n'

위의 예에서 우리는 완전한 문서를 인코딩했지만, 수프의 특정 요소를 마치 파이썬 문자열 인 것처럼 인코딩 할 수 있습니다.

>>> soup.p.encode("latin-1")
b'<p>0My first paragraph.</p>'
>>> soup.h1.encode("latin-1")
b'<h1>My First Heading</h1>'

선택한 인코딩으로 표현할 수없는 모든 문자는 숫자 XML 엔티티 참조로 변환됩니다. 다음은 그러한 예입니다.

>>> markup = u"<b>\N{SNOWMAN}</b>"
>>> snowman_soup = BeautifulSoup(markup)
>>> tag = snowman_soup.b
>>> print(tag.encode("utf-8"))
b'<b>\xe2\x98\x83</b>'

위의 내용을 "latin-1"또는 "ascii"로 인코딩하려고하면 "☃"가 생성되어 이에 대한 표현이 없음을 나타냅니다.

>>> print (tag.encode("latin-1"))
b'<b>☃</b>'
>>> print (tag.encode("ascii"))
b'<b>☃</b>'

유니 코드, 젠장

Unicode, Dammit은 주로 들어오는 문서가 알 수없는 형식 (주로 외국어)이고 알려진 형식 (유니 코드)으로 인코딩하고 싶을 때 사용되며이 모든 작업을 수행하기 위해 Beautifulsoup이 필요하지 않습니다.