有人能详细说明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解析时,将删除其中一个表单标签)
提前谢谢。
答案 0 :(得分:0)
您可以使用速度非常快的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)
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)