¿Cómo soluciono las etiquetas HTML anidadas / no cerradas incorrectamente?

Necesito desinfectar el HTML enviado por el usuario cerrando cualquier etiqueta abierta con el orden correcto de anidamiento. He estado buscando un algoritmo o código de Python para hacer esto, pero no he encontrado nada excepto algunas implementaciones a medias en PHP, etc.

Por ejemplo, algo como

<p>
  <ul>
    <li>Foo

se convierte

<p>
  <ul>
    <li>Foo</li>
  </ul>
</p>

Cualquier ayuda sería apreciada :)

Respuestas a la pregunta(5)

Su respuesta a la pregunta