@ur001, посмотрел еще раз код lxml, там есть много всяких регекспов, разбросанных по модулям (
github.com/lxml/lxml/blob/master/src/lxml/html/clean.py#L62 ), но я был не прав совершенно: парсинг html в lxml основан большей частью на парсинге xml.
Т.е. lxml считает, что html — это просто невалидный xml, который можно поправить. С теоретической точки зрения предположение неверное, для парсинга html5 и xml нужны совсем разные парсеры, но на практике часто работает.