如果传递给BeautifulSoup构造函数的HTML字符串包含任何HTML实体,它们将会被转换成Unicode字符。
HTML实体是以一个与号(&)开始并以分号(;)结束的字符串。它们用来显示那些会被误认为是HTML代码的保留字符。一些HTML实体的例子包括:
实体名 |
描述 |
实体符号 |
十进制数字代码 |
< |
小于 |
< |
< |
> |
大于 |
> |
> |
& |
与号 |
& |
& |
" |
双引号 |
" |
" |
' |
单引号 |
' |
' |
" |
左双引号 |
“ |
“ |
" |
右双引号 |
” |
” |
£ |
英镑 |
£ |
£ |
¥ |
日元 |
¥ |
¥ |
€ |
欧元 |
€ |
€ |
© |
版权 |
© |
© |
默认情况下,只有在输出时会转义的字符是裸露的与号和尖括号。这些会变成&
, <
, 和>
。
对于其他的字符,它们将会被转换成Unicode字符。
示例
from bs4 import BeautifulSoup
soup = BeautifulSoup("Hello “World!”", 'html.parser')
print(str(soup))
输出
Hello "World!"
如果你将文档转换成字节串,Unicode字符将会被编码成UTF-8。你不会得到原来的HTML实体:
示例
from bs4 import BeautifulSoup
soup = BeautifulSoup("Hello “World!”", 'html.parser')
print(soup.encode())
输出
b'Hello \xe2\x80\x9cWorld!\xe2\x80\x9d'
为了改变这种行为,可以为prettify()
方法的formatter
参数提供一个值。formatter
参数可能的值如下:
-
formatter="minimal"
—— 这是默认值。字符串只会被处理到足以确保Beautiful Soup生成有效的HTML/XML。
-
formatter="html"
—— Beautiful Soup将会尽可能地将Unicode字符转换为HTML实体。
-
formatter="html5"
—— 类似于formatter="html"
,但是Beautiful Soup会在HTML空标签(如br
)的结尾省略斜杠。
-
formatter=None
—— Beautiful Soup在输出时不修改字符串。这是最快的选项,但它可能导致Beautiful Soup生成无效的HTML/XML。
示例
from bs4 import BeautifulSoup
french = "<p>Il a dit <<Sacré bleu!>></p>"
soup = BeautifulSoup(french, 'html.parser')
print("minimal: ")
print(soup.prettify(formatter="minimal"))
print("html: ")
print(soup.prettify(formatter="html"))
print("None: ")
print(soup.prettify(formatter=None))
输出
minimal:
<p>
Il a dit <<Sacré bleu!>>
</p>
html:
<p>
Il a dit <<Sacré bleu!>>
</p>
None:
<p>
Il a dit <<Sacré bleu!>>
</p>
此外,Beautiful Soup库提供了格式化类。你可以将任何一个这些类的对象作为参数传递给prettify()
方法。
-
HTMLFormatter
类 —— 用于定制HTML文档的格式化规则。
-
XMLFormatter
类 —— 用于定制XML文档的格式化规则。