beautifulsoup配置autoclosing标签

时间:2014-04-09 19:36:23

标签: python html parsing beautifulsoup

让我们通过例子解释我的问题:

from bs4 import BeautifulSoup                                                                                                                                                                                                    

txt = """                                                                                                                                                                                                                        
<html>                                                                                                                                                                                                                           
<body>                                                                                                                                                                                                                           
<ul>
    <li> 1
    <li> 2
</ul>
</body>
"""

soup = BeautifulSoup(txt)

print(soup.prettify())

此脚本的输出:

<html>
 <body>
  <ul>
   <li>
    1
    <li>
     2
    </li>
   </li>
  </ul>
 </body>
</html>

正如您在输入中看到的那样,html li标签未被关闭。 BeautifulSoup以某种方式修复它。但是可以配置BeautifulSoup以在输出中获得此结果吗?

<html>
 <body>
  <ul>
   <li>
    1
   </li>
   <li>
     2
   </li>
  </ul>
 </body>
</html>

1 个答案:

答案 0 :(得分:2)

&#39;修复&#39;由用于将HTML加载到BeautifulSoup对象树中的解析器应用。

您可以换出不同的解析器;破坏的HTML由不同的解析器以不同的方式修复。你必须install additional packages;默认情况下,只有html.parser选项可用。

我在这里使用html5lib解析器,它将以与浏览器相同的方式解释非标准HTML,或者您可以尝试使用lxml解析器:

>>> print BeautifulSoup(txt, 'html5lib').prettify()
<html>
 <head>
 </head>
 <body>
  <ul>
   <li>
    1
   </li>
   <li>
    2
   </li>
  </ul>
 </body>
</html>
>>> print BeautifulSoup(txt, 'lxml').prettify()
<html>
 <body>
  <ul>
   <li>
    1
   </li>
   <li>
    2
   </li>
  </ul>
 </body>
</html>

如您所见,这两者都会产生所需的输出。

它只是展示此问题的默认解析器:

>>> print BeautifulSoup(txt, 'html.parser').prettify()
<html>
 <body>
  <ul>
   <li>
    1
    <li>
     2
    </li>
   </li>
  </ul>
 </body>
</html>