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>]
即。输入在标签前自动关闭。
答案 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
内容的原因。