使用美丽的汤正确解析空的html标签

时间:2017-03-24 14:28:23

标签: python html beautifulsoup

HTML有一个空元素的概念,如MDN所列。然而,美丽的汤似乎没有正确处理它们:

import bs4

soup = bs4.BeautifulSoup(
    '<div><input name=the-input><label for=the-input>My label</label></div>',
    'html.parser'
)
print(soup.contents)

我明白了:

[<div><input name="the-input"><label for="the-input">My label</label></input></div>]

即。输入已经包装了标签。

问题:有没有办法让美丽的汤来解析这个?或者在某个我尚未找到的地方有官方解释这种行为吗?

至少我期待的是:

[<div><input name="the-input"></input><label for="the-input">My label</label></div>]

即。输入在标签前自动关闭。

2 个答案:

答案 0 :(得分:3)

我会说汤正在尽力修复这个html结构,在某些情况下它确实很有用。

无论如何,对于你的情况我会说要使用lxml,它会根据你的需要解析html结构,或者试试parsel

答案 1 :(得分:3)

正如他们documentation TimeSpan中所述,将文档解析为Web浏览器(在本例中为html5lib)。它会尝试通过在需要时添加/关闭标记来修复文档树。

在您的示例中,我使用lxml作为解析器,它给出了以下结果:

lxml

请注意,soup = bs4.BeautifulSoup( '<div><input name=the-input><label for=the-input>My label</label></div>', 'lxml' ) print(soup.body.contents) [<div><input name="the-input"/><label for="the-input">My label</label></div>] 添加了html&amp;身体标签,因为它们没有出现在源中,这就是我打印lxml内容的原因。