BeautifulSoup(bs4):如何忽略格式错误的HTML中的结束标记

ami*_*pra 2 html python parsing beautifulsoup

我正在使用Beautifulsoup(bs4)废弃HTML页面.它有一个列表<ul>,其中<li>包含一些有趣的链接(href).

片段:

<ul>
 <!-- C 1-3 --></p>
 <li>
   <a href="http://LINK1" target="_blank">Link1 description</a>
 </li>
</ul>

<ul>
 <!-- E 1-2-3-6 --></p>
 <li>
  <a href="LINK-2" target="_blank">Link-2 description</a>
 </li>
 <p><!-- E 4-5 -7-8-9-10-11 --></p>
</ul>
Run Code Online (Sandbox Code Playgroud)

问题:当我find_all()用来提取全部<ul>- 我没有得到它,因为错误的结局</p>,缺少开放<p>.浏览器忽略了这个并且渲染正常,但是BS4搞砸了解析.有人试图忽略BS4中任何格式错误的标签吗?

entries = soup.find_all(lambda x: x.name == 'ul')
print(len(entries))
print(entries[0])

1
<ul>
 <!-- C 1-3 --></ul>
Run Code Online (Sandbox Code Playgroud)

use*_*514 5

我认为你应该为HTML尝试更宽松的解析器.例如:

soup = BeautifulSoup(pg, "html5lib")
Run Code Online (Sandbox Code Playgroud)

对于html5lib解析器是最宽松的解析器.优点是:

  • 非常宽容
  • 以与Web浏览器相同的方式解析页面
  • 创建有效的HTML5

缺点是:

  • 非常慢
  • 外部Python依赖

该文档提供了对不同解析器的优缺点的一些解释:https://beautiful-soup-4.readthedocs.org/en/latest/#installing-a-parser