Ila*_*anL 5 beautifulsoup python-3.x
任何人都可以详细说明 html.parser 和 html5lib 等解析器之间的区别吗?我偶然发现了一个奇怪的行为,当使用 html.parser 时,它会忽略特定位置的所有标签。看看这段代码
from bs4 import BeautifulSoup
html = """
<html>
<head></head>
<body>
<!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]-->
<![endif]-->
<a href="test"></a>
<a href="test"></a>
<a href="test"></a>
<a href="test"></a>
<!--[if lte IE 8]>
<![endif]-->
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')
tags = soup.find_all('a')
print(tags)
Run Code Online (Sandbox Code Playgroud)
这将返回一个空列表,而使用 html5lib 时,将按预期返回所需的“a”标签。有谁知道原因吗?
我已阅读文档,但有关不同解析器的解释非常模糊。
我还注意到 html5lib 会忽略诸如嵌套表单标签之类的无效标签,有没有办法使用 html5lib 来避免 html.parser 的上述行为,并且还获得诸如嵌套表单标签之类的无效标签?(使用 html5lib 解析时,其中一个表单标签将被删除)
提前致谢。
您可以使用lxml它非常快并且可以使用find_all或select获取所有标签。
from bs4 import BeautifulSoup
html = """
<html>
<head></head>
<body>
<!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]-->
<![endif]-->
<a href="test"></a>
<a href="test"></a>
<a href="test"></a>
<a href="test"></a>
<!--[if lte IE 8]>
<![endif]-->
</body>
</html>
"""
soup = BeautifulSoup(html, 'lxml')
tags = soup.find_all('a')
print(tags)
Run Code Online (Sandbox Code Playgroud)
或者
from bs4 import BeautifulSoup
html = """
<html>
<head></head>
<body>
<!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]-->
<![endif]-->
<a href="test"></a>
<a href="test"></a>
<a href="test"></a>
<a href="test"></a>
<!--[if lte IE 8]>
<![endif]-->
</body>
</html>
"""
soup = BeautifulSoup(html, 'lxml')
tags = soup.select('a')
print(tags)
Run Code Online (Sandbox Code Playgroud)