Posterior a de una larga búsqueda de datos solucionamos esta cuestión que presentan ciertos los lectores. Te brindamos la solución y nuestro objetivo es servirte de mucha apoyo.
Código fuente:Lib / html / parser.py
Este módulo define una clase HTMLParser
que sirve como base para analizar archivos de texto formateados en HTML (HyperText Mark-up Language) y XHTML.
class html.parser.HTMLParser(*, convert_charrefs=True)
-
Cree una instancia de analizador capaz de analizar el marcado no válido.
Si convert_charrefs es
True
(el predeterminado), todas las referencias de caracteres (excepto lasscript
/style
elementos) se convierten automáticamente a los caracteres Unicode correspondientes.Un
HTMLParser
La instancia se alimenta con datos HTML y llama a los métodos del controlador cuando se encuentran etiquetas de inicio, etiquetas de finalización, texto, comentarios y otros elementos de marcado. El usuario debe subclaseHTMLParser
y anular sus métodos para implementar el comportamiento deseado.Este analizador no comprueba que las etiquetas finales coincidan con las etiquetas de inicio ni llama al controlador de etiquetas finales para los elementos que se cierran implícitamente al cerrar un elemento externo.
Modificado en la versión 3.4: convert_charrefs argumento de palabra clave agregado.
Modificado en la versión 3.5: El valor predeterminado para el argumento convert_charrefs es ahora
True
.
Ejemplo de aplicación de analizador HTML
Como ejemplo básico, a continuación se muestra un analizador HTML simple que utiliza la HTMLParser
class para imprimir etiquetas de inicio, etiquetas de finalización y datos a medida que se encuentran:
from html.parser import HTMLParser classMyHTMLParser(HTMLParser):defhandle_starttag(self, tag, attrs):print("Encountered a start tag:", tag)defhandle_endtag(self, tag):print("Encountered an end tag :", tag)defhandle_data(self, data):print("Encountered some data :", data) parser = MyHTMLParser() parser.feed('Test ''')
La salida será entonces:
Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h1 Encountered some data : Parse me! Encountered an end tag : h1 Encountered an end tag : body Encountered an end tag : html
Métodos HTMLParser
HTMLParser
instancias tienen los siguientes métodos:
HTMLParser.feed(data)
-
Alimente un poco de texto al analizador. Se procesa en la medida en que consta de elementos completos; Los datos incompletos se almacenan en el búfer hasta que se alimentan más datos o
close()
se llama. datos debe serstr
.
HTMLParser.close()
-
Fuerza el procesamiento de todos los datos almacenados en búfer como si fueran seguidos por una marca de fin de archivo. Este método puede ser redefinido por una clase derivada para definir un procesamiento adicional al final de la entrada, pero la versión redefinida siempre debe llamar al
HTMLParser
método de clase baseclose()
.
HTMLParser.reset()
-
Restablece la instancia. Pierde todos los datos sin procesar. Esto se llama implícitamente en el momento de la instanciación.
HTMLParser.getpos()
-
Devuelve el número de línea actual y el desplazamiento.
HTMLParser.get_starttag_text()
-
Devuelve el texto de la etiqueta de inicio abierta más recientemente. Normalmente, esto no debería ser necesario para el procesamiento estructurado, pero puede ser útil para tratar con HTML “tal como se implementó” o para volver a generar entradas con cambios mínimos (espacios en blanco entre attributes se puede conservar, etc.).
Los siguientes métodos se llaman cuando se encuentran datos o elementos de marcado y están destinados a ser reemplazados en una subclase. Las implementaciones de la clase base no hacen nada (excepto para handle_startendtag()
):
HTMLParser.handle_starttag(tag, attrs)
-
Este método se llama para manejar el inicio de una etiqueta (p. Ej.
).los etiqueta argumento es el nombre de la etiqueta convertida a minúsculas. los attrs argumento es una lista de
(name, value)
pares que contienen el attributes encontrado dentro de la etiqueta<>
soportes. los nombre se traducirá a minúsculas y las comillas en el valor se han eliminado y se han reemplazado las referencias a personajes y entidades.Por ejemplo, para la etiqueta
, este método se llamaría como
handle_starttag('a', [('href', 'https://www.cwi.nl/')])
.Todas las referencias de entidad de
html.entities
son reemplazados en el attribute valores.HTMLParser.handle_endtag(tag)
-
Este método se llama para manejar la etiqueta final de un elemento (p. Ej.
).
los etiqueta argumento es el nombre de la etiqueta convertida a minúsculas.
HTMLParser.handle_startendtag(tag, attrs)
-
Similar a
handle_starttag()
, pero se llama cuando el analizador encuentra una etiqueta vacía de estilo XHTML (handle_starttag()
yhandle_endtag()
.
HTMLParser.handle_data(data)
-
Este método se llama para procesar datos arbitrarios (por ejemplo, nodos de texto y el contenido de
y
).
HTMLParser.handle_entityref(name)
-
Este método se llama para procesar una referencia de carácter con nombre del formulario
&name;
(p.ej>
), dónde nombre es una referencia de entidad general (p. ej.'gt'
). Este método nunca se llama si convert_charrefs esTrue
.
HTMLParser.handle_charref(name)
-
Este método se llama para procesar referencias de caracteres numéricos decimales y hexadecimales de la forma
NNN;
yNNN;
. Por ejemplo, el equivalente decimal para>
es>
, mientras que el hexadecimal es>
; en este caso el método recibirá'62'
o'x3E'
. Este método nunca se llama si convert_charrefs esTrue
.
HTMLParser.handle_comment(data)
-
Este método se llama cuando se encuentra un comentario (p. Ej.
).
Por ejemplo, el comentario
hará que este método sea llamado con el argumento
' comment '
.El contenido de los comentarios condicionales de Internet Explorer (condcoms) también se enviará a este método, por lo que, para
, este método recibirá
'[if IE 9]>IE9-specific content.
HTMLParser.handle_decl(decl)
-
Este método se llama para manejar una declaración de tipo de documento HTML (p. Ej.
).
los decl El parámetro será el contenido completo de la declaración dentro del
marcado (p. ej.
'DOCTYPE html'
).
HTMLParser.handle_pi(data)
-
Método llamado cuando se encuentra una instrucción de procesamiento. los datos El parámetro contendrá la instrucción de procesamiento completa. Por ejemplo, para la instrucción de procesamiento
, este método se llamaría como
handle_pi("proc color='red'")
. Está destinado a ser reemplazado por una clase derivada; la implementación de la clase base no hace nada.Nota
los
HTMLParser
La clase usa las reglas sintácticas SGML para procesar instrucciones. Una instrucción de procesamiento XHTML usando el rastreo'?'
causará el'?'
para ser incluido en datos.
HTMLParser.unknown_decl(data)
-
Este método se llama cuando el analizador lee una declaración no reconocida.
los datos El parámetro será el contenido completo de la declaración dentro del
margen. A veces es útil que una clase derivada lo invalide. La implementación de la clase base no hace nada.
Ejemplos de
La siguiente clase implementa un analizador que se utilizará para ilustrar más ejemplos:
from html.parser import HTMLParser from html.entities import name2codepoint classMyHTMLParser(HTMLParser):defhandle_starttag(self, tag, attrs):print("Start tag:", tag)for attr in attrs:print(" attr:", attr)defhandle_endtag(self, tag):print("End tag :", tag)defhandle_data(self, data):print("Data :", data)defhandle_comment(self, data):print("Comment :", data)defhandle_entityref(self, name): c =chr(name2codepoint[name])print("Named ent:", c)defhandle_charref(self, name):if name.startswith('x'): c =chr(int(name[1:],16))else: c =chr(int(name))print("Num ent :", c)defhandle_decl(self, data):print("Decl :", data) parser = MyHTMLParser()
Analizando un tipo de documento:
>>> parser.feed('') Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"
Analizar un elemento con unos pocos attributes y un título:
>>> parser.feed('') Start tag: img attr:('src','python-logo.png') attr:('alt','The Python logo')>>>>>> parser.feed('') Start tag: h1 Data : Python End tag : h1
El contenido de script
y style
Los elementos se devuelven tal cual, sin más análisis:
>>> parser.feed('') Start tag: style attr:('type','text/css') Data :#python color: green End tag : style >>> parser.feed('') Start tag: script attr:('type','text/javascript') Data : alert("hello!"); End tag : script
Analizando comentarios:
>>> parser.feed(''...'') Comment : a comment Comment :[if IE 9]>IE-specific content<![endif]
Analizar referencias de caracteres numéricos y con nombre y convertirlas en el carácter correcto (nota: estas 3 referencias son todas equivalentes a '>'
):
>>> parser.feed('>>>') Named ent:> Num ent :> Num ent :>
Alimentando trozos incompletos a feed()
funciona, pero handle_data()
podría llamarse más de una vez (a menos que convert_charrefs se establece en True
):
>>>for chunk in[','an>buff','ered ','text,'pan>']:... parser.feed(chunk)... Start tag: span Data : buff Data : ered Data : text End tag : span
Analizar HTML no válido (por ejemplo, sin comillas attributes) también funciona:
>>> parser.feed('') Start tag: p Start tag: a attr:('class','link') attr:('href','#main') Data : tag soup End tag : p End tag : a