漂亮汤(BeautifulSoup)不同的解析器

5
有人能更详细地解释一下像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)

使用HTML解析器时,这将返回一个空列表,而使用html5lib时,期望的"a"标签会如预期般返回。

有人知道原因吗?我已经阅读了文档,但关于不同解析器的解释还是很模糊。

另外,我注意到html5lib会忽略无效的标签,例如嵌套的表单标签,有没有办法使用html5lib来避免html.parser的上述行为,并同时获取无效的标签,如嵌套的表单标签?(使用html5lib解析时,其中一个表单标签被删除)

提前感谢。


1个回答

1
你可以使用非常快速且可以使用find_allselect来获取所有标签的lxml
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)

或者

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接