在我的HTML中,我有很多<br>
标签(未公开)。测试html如下:
html = r"<html><head><title>s</title></head><body>something <br> <b> another thing</b> " \
r"<br> even more <br> <b> end</b></body></html>"
这是一个正确的HTML使用权吗?简单和&#34;日期&#34;,但仍然合法?
现在我注意到beatifulsoup将这个html转换成一个真正的混乱,而不是一个只有1层深度低于<body>
&#34;的平面树。它变得多层深,使分析变得繁琐。显示html也会显示:
html = r"<html><head><title>s</title></head><body>something <br> <b> another thing</b> " \
r"<br> even more <br> <b> end</b></body></html>"
soup = BeautifulSoup(html, "html.parser")
print(soup)
输出:
<html><head></head><body>something <br> <b> another thing</b> <br> even more <br> <b> end</b></br></br></br></body></html>
如果我使用&#34; html5lib&#34;此行为会发生变化 - 此时输出变为(我实际希望获得):
输出:
<html><head></head><body>something <br/> <b> another thing</b> <br/> even more <br/> <b> end</b></body></html>
现在,当html5lib&#34;修复&#34;问题,仍然不是我希望的那样:我正在提供合法的html
代码吗?那么为什么不同的解析器会给出不同的结果?
答案 0 :(得分:1)
您可以检查解析器here之间的区别。
html5lib
尝试修复文档,如果文档的格式不是像浏览器那样有效,那么如果你想要打印格式良好的HTML文档,它是最好的选择。
lxml
做同样的事情,但速度更快。很多。
默认解析器不会为此目的而服务,如果你想使用它来进行简单的操作就可以正常工作,你想要维护文档的结构,使用上面提到的解析器。
正如BS
所述:
HTML解析器之间也存在差异。如果你给Beautiful Soup一个完美形成的HTML文档,这些差异并不重要。一个解析器会比另一个解析器更快,但它们都会为您提供一个看起来与原始HTML文档完全相同的数据结构。 但是如果文档形式不完整,不同的解析器会给出不同的结果。