📜  Beautiful Soup-编码

📅  最后修改于: 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,该死

Unicode,Dammit主要用于传入文档采用未知格式(主要是外语)并且我们要以某种已知格式(Unicode)进行编码,并且我们不需要Beautifulsoup来完成所有操作的情况。