BeautifulSoup 不同的解析器

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 解析时,其中一个表单标签将被删除)

提前致谢。

Kun*_*duK 1

您可以使用lxml它非常快并且可以使用find_allselect获取所有标签。

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)