Beautifulsoup` <br/>`标签从输入处理

时间:2017-03-25 21:44:09

标签: python html beautifulsoup

在我的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代码吗?那么为什么不同的解析器会给出不同的结果?

1 个答案:

答案 0 :(得分:1)

您可以检查解析器here之间的区别。

html5lib尝试修复文档,如果文档的格式不是像浏览器那样有效,那么如果你想要打印格式良好的HTML文档,它是最好的选择。

lxml做同样的事情,但速度更快。很多。

默认解析器不会为此目的而服务,如果你想使用它来进行简单的操作就可以正常工作,你想要维护文档的结构,使用上面提到的解析器。

正如BS所述:

  

HTML解析器之间也存在差异。如果你给Beautiful Soup一个完美形成的HTML文档,这些差异并不重要。一个解析器会比另一个解析器更快,但它们都会为您提供一个看起来与原始HTML文档完全相同的数据结构。   但是如果文档形式不完整,不同的解析器会给出不同的结果。