BeautifulSoup不同的解析器

时间:2019-04-27 12:10:01

标签: python-3.x beautifulsoup

有人能详细说明html.parser和html5lib之类的解析器之间的区别吗? 我偶然发现了一个奇怪的行为,在使用html.parser时,它会忽略特定位置的所有标签。看这段代码

@ControllerAdvice
@RestController
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({AccessDeniedException.class})
    public final
            ResponseEntity<Object> handleUserNotFoundException(EntityNotFoundException ex, WebRequest request){
        return new ResponseEntity<>("Unauthorized", HttpStatus.UNAUTHORIZED);
    }
}

这将返回一个空列表,而使用html5lib时,将按预期返回所需的“ a”标签。 有人知道原因吗?

我已经阅读了文档,但是关于不同解析器的解释非常模糊。

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

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用速度非常快的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)

OR

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)