让我们通过例子解释我的问题:
from bs4 import BeautifulSoup
txt = """
<html>
<body>
<ul>
<li> 1
<li> 2
</ul>
</body>
"""
soup = BeautifulSoup(txt)
print(soup.prettify())
此脚本的输出:
<html>
<body>
<ul>
<li>
1
<li>
2
</li>
</li>
</ul>
</body>
</html>
正如您在输入中看到的那样,html li
标签未被关闭。 BeautifulSoup以某种方式修复它。但是可以配置BeautifulSoup以在输出中获得此结果吗?
<html>
<body>
<ul>
<li>
1
</li>
<li>
2
</li>
</ul>
</body>
</html>
答案 0 :(得分:2)
&#39;修复&#39;由用于将HTML加载到BeautifulSoup对象树中的解析器应用。
您可以换出不同的解析器;破坏的HTML由不同的解析器以不同的方式修复。你必须install additional packages;默认情况下,只有html.parser
选项可用。
我在这里使用html5lib
解析器,它将以与浏览器相同的方式解释非标准HTML,或者您可以尝试使用lxml
解析器:
>>> print BeautifulSoup(txt, 'html5lib').prettify()
<html>
<head>
</head>
<body>
<ul>
<li>
1
</li>
<li>
2
</li>
</ul>
</body>
</html>
>>> print BeautifulSoup(txt, 'lxml').prettify()
<html>
<body>
<ul>
<li>
1
</li>
<li>
2
</li>
</ul>
</body>
</html>
如您所见,这两者都会产生所需的输出。
它只是展示此问题的默认解析器:
>>> print BeautifulSoup(txt, 'html.parser').prettify()
<html>
<body>
<ul>
<li>
1
<li>
2
</li>
</li>
</ul>
</body>
</html>