2012-06-16 9 views
12

Ho utilizzato HTML Parser per scartare i dati dai siti Web e rimuovere la codifica html mentre lo facevo. Sono a conoscenza di vari moduli come Beautiful Soup, ma ho deciso di seguire il percorso di non dipendere dai moduli "esterni". C'è un codice fornito da Eloff: Strip HTML from strings in PythonUtilizzo di HTMLParser in 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() 

Funziona in Python 3.1. Tuttavia, di recente ho eseguito l'aggiornamento a Python 3.2.x e ho riscontrato che ricevo errori relativi al codice HTML Parser come scritto sopra.

miei primi punti di errore alla linea:

s.feed(html) 

... e l'errore dice ...

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

Così, dopo un po 'di ricerca, aggiungo "rigorosa = True "per la linea superiore, il che rende ...

class MLStripper(HTMLParser, strict=True) 

Tuttavia, ottengo il nuovo errore di:

TypeError: type() takes 1 or 3 arguments 

Per vedere cosa sarebbe successo, ho tolto l'argomento "auto" e rimane in "stretta = True" ... che ha dato l'errore:

NameError: global name 'self' is not defined 

... e ho avuto il sentimento "Sto indovinando su ipotesi".

Non ho idea di quale sarebbe il terzo argomento nella riga class MLStripper(HTMLParser), dopo self e strict=True; la ricerca non ha gettato alcun chiarimento.

risposta

20

La sottoclasse è HTMLParser, ma non si sta chiamando il suo metodo __init__. È necessario aggiungere una riga al vostro metodo di __init__:

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

Inoltre, per Python 3, la linea di importazione è:

from html.parser import HTMLParser 

Con questi cambiamenti, un semplice esempio funziona. Non modificare la linea class, che non è correlata.

+2

Che ha funzionato perfettamente, Thomas K. Grazie mille! Gli script funzionano perfettamente ancora una volta con quel codice "super() .__ init __()" inserito. – MilesNielsen

+0

Questo risolve anche l'attributo : L'oggetto 'HTMLTagRemover' non ha attributo 'convert_charrefs' super() .__ init __() NON era richiesto in Python2 per me ma era in Python3 - grazie –