为什么BeautifulSoup在HTML中输出自关闭标签?

问题描述 投票:0回答:1

我尝试过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?

python beautifulsoup
1个回答
0
投票

作为框架挑战:

它们都有/>“自关闭”无效标签。

参考HTML规范:

13.1.2.1 开始标签

开始标签必须具有以下格式:

  1. 开始标记的第一个字符必须是 U+003C 小于符号字符 (<).
  2. 开始标签的接下来的几个字符必须是元素的标签名称
  3. 下一步如果要添加任何属性,首先必须有一个或多个ASCII 空格
  4. 那么,开始标签可以有多个属性,其语法如下所述。属性必须用一个或多个 ASCII 空格彼此分隔。
  5. 属性之后,或者如果没有属性则在
  6. 标签名称之后,可能有一个或多个ASCII空格。 (有些属性后面需要跟一个空格。请参阅下面的属性部分。)
  7. 然后,如果该元素是
  8. void 元素之一,或者该元素是 foreign elements,则可能有一个 U+002F SOLIDUS 字符 (/),它在 foreign elements 上标记开始标记为自动关闭。在 void 元素上,它不会将开始标记标记为自闭合,而是不必要的,并且没有任何效果。对于此类 void 元素,应谨慎使用 - 特别是因为,如果直接在 unquoted 属性值前面,它会成为属性值的一部分,而不是被解析器丢弃。
  9. 最后,开始标签必须以 U+003E 大于符号 (>) 结束。
规范明确指出,对于空元素,单个 U+002F SOLIDUS 字符 (

/

),紧接在结束 U+003E GREATER-THAN SIGN 字符 (
>
) 之前:

    是允许的;
  • 是不必要的(没有任何影响);和
  • 不将标签标记为自动关闭。
因此,在 HTML 中,

<br/>

 是有效的 HTML,不是自闭合标签,但相当于 
<br>
,且 
/
 字符应被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.