Вы не можете обрабатывать какие-либо данные, если не знаете, какие данные нужно обрабатывать. Это относится к вашей задаче, как и к любой другой. Если вы хотите обрабатывать грязные данные, вам нужно указать, с какой грязью вы ожидаете столкнуться и как вы предлагаете с ней бороться. Это определит принятый подход.
Может случиться так, что вид обработки, который вам нужно сделать, может быть выполнен существующей библиотекой, такой как TagSoup или validator.nu. Или, может быть, это можно сделать с помощью регулярных выражений. Без спецификации задачи мы не можем знать.
Рассмотрим пример. Предположим, что входной файл содержит "< < < < > > > >"
Что бы вы хотели, чтобы ваша программа сделала с ним?
... ПОЗЖЕ
Из вашего комментария Звучит так, как будто HTML «правильно сформирован, но недействителен», если брать терминологию XML. Это означает, что вы могли бы рассмотреть решение XSLT:
<xsl:apply-templates select="saxon:parse-html('input.bad.html')"/>
...
<xsl:template match="a/@href | */@class | */@id | .... (:all valid attributes:)">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="@* (: attributes not in the above list :)">
<!-- no action (drop the attribute) -->
</xsl:template>
saxon:parse-html()
является расширением Saxon XSLT. С другими процессорами может быть другой способ анализа HTML в XML DOM и использования XML DOM в качестве входных данных для процессора.