我尝试过3种不同的解析器:
lxml
、html5lib
、html.parser
它们都输出无效的 HTML:
>>> BeautifulSoup('<br>', 'html.parser')
<br/>
>>> BeautifulSoup('<br>', 'lxml')
<html><body><br/></body></html>
>>> BeautifulSoup('<br>', 'html5lib')
<html><head></head><body><br/></body></html>
>>> BeautifulSoup('<br>', 'html.parser').prettify()
'<br/>\n'
它们都有
/>
“自动关闭”无效标签。
如何让 BeautifulSoup 输出具有 void 标签而没有
/>
的 HTML?
作为框架挑战:
它们都有/>“自关闭”无效标签。
参考HTML规范:
规范明确指出,对于空元素,单个 U+002F SOLIDUS 字符 (13.1.2.1 开始标签
开始标签必须具有以下格式:
- 开始标记的第一个字符必须是 U+003C 小于符号字符 (<).
- 开始标签的接下来的几个字符必须是元素的标签名称。
- 下一步如果要添加任何属性,首先必须有一个或多个ASCII 空格。
- 那么,开始标签可以有多个属性,其语法如下所述。属性必须用一个或多个 ASCII 空格彼此分隔。
属性之后,或者如果没有属性则在- 标签名称之后,可能有一个或多个ASCII空格。 (有些属性后面需要跟一个空格。请参阅下面的属性部分。)
然后,如果该元素是- void 元素之一,或者该元素是 foreign elements,则可能有一个 U+002F SOLIDUS 字符 (/),它在 foreign elements 上标记开始标记为自动关闭。在 void 元素上,它不会将开始标记标记为自闭合,而是不必要的,并且没有任何效果。对于此类 void 元素,应谨慎使用 - 特别是因为,如果直接在 unquoted 属性值前面,它会成为属性值的一部分,而不是被解析器丢弃。
最后,开始标签必须以 U+003E 大于符号 (>) 结束。
/
),紧接在结束 U+003E GREATER-THAN SIGN 字符 (
>
) 之前:
<br/>
是有效的 HTML,不是自闭合标签,但相当于
<br>
,且
/
字符应被忽略。