Obtención de información de posición al analizar HTML en Python

Estoy tratando de encontrar una manera de analizar HTML (potencialmente malformado) en Python y, si se cumple un conjunto de condiciones, generar esa parte del documento con la posición (línea, columna). La información de posición es lo que me está haciendo tropezar aquí. Y para ser claros, no tengo necesidad de construir un árbol de objetos. Simplemente quiero encontrar ciertos datos y su posición en el documento original (piense en un corrector ortográfico, por ejemplo: 'palabra "foo" en la línea x, columna y, está mal escrita) "

Como ejemplo, quiero algo como esto (usando ElementTree'sAPI de destino):

import xml.etree.ElementTree as ET

class EchoTarget:
    def start(self, tag, attrib):
        if somecondition():
            print "start", tag, attrib, self.getpos()
    def end(self, tag):
        if somecondition():
            print "end", tag, self.getpos()
    def data(self, data):
        if somecondition():
            print "data", repr(data), self.getpos()

target = EchoTarget()
parser = ET.XMLParser(target=target)
parser.feed("<p>some text</p>")
parser.close() 

Sin embargo, por lo que puedo decir, elgetpos() El método (o algo similar) no existe. Y, por supuesto, eso es usar un analizador XML. Quiero analizar HTML potencialmente malformado.

Curiosamente, elHTMLParser clase en Python Standard Lib ofrece soporte para obtener la información de ubicación (con ungetpos() método), pero es horrible en el manejo de HTML con formato incorrecto y se ha eliminado como una posible solución. Necesito analizar HTML que existe en la palabra real sin romper el analizador.

Soy consciente de dos analizadores HTML que funcionarían bien para analizar HTML con formato incorrecto, a saberlxml yhtml5lib. Y de hecho, preferiría usar cualquiera de ellos sobre cualquier otra opción disponible en Python.

Sin embargo, por lo que puedo decir, html5lib no ofrece API de eventos y requeriría que el documento se analice en un objeto de árbol. Entonces tendría que recorrer el árbol en iteración. Por supuesto, en ese punto, no hay asociación con el documento fuente y se pierde toda la información de ubicación. Entonces, html5lib está fuera, lo cual es una pena porque parece ser el mejor analizador para manejar HTML con formato incorrecto.

La biblioteca lxml ofrece una API de destino que refleja principalmente la de ElementTree, pero de nuevo, no conozco ninguna forma de acceder a la información de ubicación para cada evento. Una mirada al código fuente tampoco ofreció pistas.

lxml también ofrece una API para eventos SAX. Curiosamente, la biblioteca estándar de Python menciona que SAX tiene soporte paraObjetos de localización, pero ofrece poca documentación sobre cómo usarlos. EstaPregunta SO proporciona cierta información (cuando se utiliza un analizador SAX), pero no veo cómo se relaciona con el soporte limitado para eventos SAX que proporciona lxml.

Finalmente, antes de que alguien sugieraHermosa sopa, Señalaré que, como se indica en la página de inicio, "Beautiful Soup se encuentra en la parte superior de los analizadores Python populares como lxml y html5lib". Todo lo que me da es un objeto para extraer datos sin conexión con el documento fuente original. Al igual que con html5lib, toda la información de ubicación se pierde cuando tengo acceso a los datos. Quiero / necesito acceso directo al analizador directamente.

Para ampliar el ejemplo del corrector ortográfico que menciono al principio, me gustaría verificar la ortografía solo de las palabras en el texto del documento (pero no los nombres o atributos de la etiqueta) y tal vez desee omitir la verificación del contenido de etiquetas específicas (como el script o etiquetas de código). Por lo tanto, necesito un analizador HTML real. Sin embargo, solo estoy interesado en la posición de las palabras mal escritas en el documento fuente original cuando se trata de informar las palabras mal escritas y no tengo necesidad de construir un objeto de árbol. Para ser claros, este es solo un ejemplo de un uso potencial. Puedo usarlo para algo completamente diferente, pero las necesidades serían esencialmente las mismas. De hecho, una vez construí algo muy similar usando HTMLParser, pero nunca lo usé ya que el manejo de errores no funcionaría para ese caso de uso. Eso fue hace años, y parece que perdí ese archivo en algún lugar a lo largo de la línea. Me gustaría usar lxml o html5lib en su lugar esta vez.

Entonces, ¿hay algo que me falta? Me cuesta creer que ninguno de estos analizadores (aparte del HTMLParser en su mayoría inútil) tenga alguna forma de acceder a la información de posición. Pero si lo hacen, debe ser indocumentado, lo que me parece extraño.

Respuestas a la pregunta(3)

Su respuesta a la pregunta