2012-06-16 10 views
12

He estado utilizando HTML Parser para eliminar datos de sitios web y eliminar la codificación html mientras lo hago. Conozco varios módulos, como Beautiful Soup, pero decidí seguir el camino de no depender de módulos "externos". Hay un código de código suministrado por Eloff: Strip HTML from strings in PythonUso de HTMLParser en Python 3.2

from HTMLParser import HTMLParser 

class MLStripper(HTMLParser): 
    def __init__(self): 
     self.reset() 
     self.fed = [] 
    def handle_data(self, d): 
     self.fed.append(d) 
    def get_data(self): 
     return ''.join(self.fed) 

def strip_tags(html): 
    s = MLStripper() 
    s.feed(html) 
    return s.get_data() 

Funciona en Python 3.1. Sin embargo, recientemente me actualicé a Python 3.2.x y descubrí que recibo errores con respecto al código del analizador HTML, tal como se describió anteriormente.

Mis primeros puntos de error en la línea:

s.feed(html) 

... y dice que el error ...

AttributeError: 'MLStripper' object has no attribute 'strict' 

Así, después de un poco de investigación, que se suman "estricta = True "a la línea superior, por lo que es ...

class MLStripper(HTMLParser, strict=True) 

Sin embargo, consigo el nuevo error de:

TypeError: type() takes 1 or 3 arguments 

Para ver lo que sucedería, que eliminan el argumento de "yo" y deja en la "estricta = True" ... el que se rindió el error:

NameError: global name 'self' is not defined 

... y me dieron el sentimiento de "supongo que conjeturas". No tengo idea de cuál sería el tercer argumento en la línea class MLStripper(HTMLParser), después de self y strict=True; la investigación no arrojó ninguna iluminación.

Respuesta

20

Está subclasificando HTMLParser, pero no está llamando al método __init__. Es necesario añadir una línea a su método de __init__:

def __init__(self): 
    super().__init__() 
    self.reset() 
    self.fed = [] 

Además, para Python 3, la línea de importación es:

from html.parser import HTMLParser 

Con estos cambios, un ejemplo sencillo obras. No cambie la línea class, eso no está relacionado.

+2

Eso funcionó a la perfección, Thomas K. ¡Muchas gracias! Los scripts funcionan perfectamente una vez más con el código "super() .__ init __() insertado. – MilesNielsen

+0

Esto también resuelve el AttributeError: el objeto 'HTMLTagRemover' no tiene ningún atributo 'convert_charrefs' super() .__ init __() NO fue requerido en Python2 pero estaba en Python3 - gracias –

Cuestiones relacionadas