2012-06-16 20 views
12

Ich habe HTML-Parser verwendet, um Daten von Websites zu verschrotten und dabei HTML-Code zu entfernen. Ich kenne verschiedene Module wie Beautiful Soup, aber ich entschied mich dafür, den Weg zu gehen, nicht von "äußeren" Modulen abhängig zu sein. Es gibt einen Code Code von Eloff geliefert: Strip HTML from strings in PythonVerwenden von 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() 

Es funktioniert in Python 3.1. Ich habe jedoch kürzlich auf Python 3.2.x aktualisiert und festgestellt, dass ich Fehler in Bezug auf den HTML-Parser-Code erhalte, wie oben beschrieben.

Mein erster Fehler verweist auf die Zeile:

s.feed(html) 

... und der Fehler sagt ...

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

So, nach ein wenig Forschung, füge ich „strict = True "auf die oberste Zeile, so dass es ...

class MLStripper(HTMLParser, strict=True) 

Allerdings habe ich den neuen Fehler:

TypeError: type() takes 1 or 3 arguments 

Um zu sehen, was passieren würde, entfernte ich das "Selbst" Argument und links in der "strict = True" ... die den Fehler gab:

NameError: global name 'self' is not defined 

... und ich habe das "Ich rate auf Vermutungen" Gefühl.

Ich habe keine Ahnung, was das dritte Argument in der class MLStripper(HTMLParser) Zeile wäre, nach self und strict=True; Forschung hat keine Erleuchtung geworfen.

Antwort

20

Sie unterklassifizieren HTMLParser, aber Sie rufen nicht seine __init__ Methode. Sie müssen eine Zeile zu Ihrer __init__ Methode hinzufügen:

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

Auch für Python 3, die Importzeile ist:

from html.parser import HTMLParser 

Mit diesen Änderungen ein einfaches Beispiel funktioniert. Ändern Sie nicht die class Zeile, die nicht verwandt ist.

+2

Das hat perfekt funktioniert, Thomas K. Vielen Dank! Skripte funktionieren wieder einwandfrei mit dem eingefügten Code "super() .__ init __()". – MilesNielsen

+0

Dies löst auch die AttributeError: 'HTMLTagRemover' Objekt hat kein Attribut 'convert_charrefs' Super() .__ Init __() war nicht erforderlich in Python2 für mich, sondern war in Python3 - danke –

Verwandte Themen