📅  最后修改于: 2020-11-09 14:27:58             🧑  作者: Mango
所有HTML或XML文档均以某种特定的编码(例如ASCII或UTF-8)编写。但是,当您将该HTML / XML文档加载到BeautifulSoup中时,它已转换为Unicode。
>>> markup = "I will display £
"
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.p
I will display £
>>> Bsoup.p.string
'I will display £'
上面的行为是因为BeautifulSoup内部使用了名为Unicode的子库,该死来检测文档的编码,然后将其转换为Unicode。
但是,Dammit并不是一直都在正确地猜测。由于逐个字节地搜索文档以猜测编码,因此需要花费大量时间。如果您已经知道编码,可以将它作为from_encoding传递给BeautifulSoup构造函数,则可以节省一些时间并避免出错。
以下是BeautifulSoup错误标识的一个示例,一个ISO-8859-8文档为ISO-8859-7-
>>> markup = b"\xed\xe5\xec\xf9
"
>>> soup = BeautifulSoup(markup)
>>> soup.h1
νεμω
>>> soup.original_encoding
'ISO-8859-7'
>>>
要解决上述问题,请使用from_encoding将其传递给BeautifulSoup-
>>> soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
>>> soup.h1
ולש
>>> soup.original_encoding
'iso-8859-8'
>>>
从BeautifulSoup 4.4.0添加的另一个新功能是exclude_encoding。当您不知道正确的编码但要确保使用Unicode时,可以使用Dammit显示错误的结果。
>>> soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])
BeautifulSoup的输出为UTF-8文档,而与BeautifulSoup的输入文档无关。在文档下面,以ISO-8859-2格式显示波兰语字符。
html_markup = """
ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
"""
>>> soup = BeautifulSoup(html_markup)
>>> print(soup.prettify())
ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
在上面的示例中,如果您注意到,标记已被重写以反映BeautifulSoup生成的文档现在采用UTF-8格式。
如果您不希望在UTF-8中生成生成的输出,则可以在prettify()中分配所需的编码。
>>> print(soup.prettify("latin-1"))
b'\n\n \n \n \n \n ą ć ę ł ń \xf3 ś ź ż Ą Ć Ę Ł Ń \xd3 Ś Ź Ż\n \n\n'
在上面的示例中,我们已经对完整文档进行了编码,但是您可以对汤中的任何特定元素进行编码,就好像它们是Python字符串-
>>> soup.p.encode("latin-1")
b'0My first paragraph.
'
>>> soup.h1.encode("latin-1")
b'My First Heading
'
您选择的编码中无法表示的所有字符都将转换为数字XML实体引用。下面是一个这样的例子-
>>> markup = u"\N{SNOWMAN}"
>>> snowman_soup = BeautifulSoup(markup)
>>> tag = snowman_soup.b
>>> print(tag.encode("utf-8"))
b'\xe2\x98\x83'
如果您尝试将上面的代码编码为“ latin-1”或“ ascii”,则会生成“☃”,表示没有任何表示形式。
>>> print (tag.encode("latin-1"))
b'☃'
>>> print (tag.encode("ascii"))
b'☃'
Unicode,Dammit主要用于传入文档采用未知格式(主要是外语)并且我们要以某种已知格式(Unicode)进行编码,并且我们不需要Beautifulsoup来完成所有操作的情况。