Utiliser HTMLParser en Python 3.2

j'ai utilisé HTML Parser pour supprimer les données des sites Web et supprimer le codage html tout en le faisant. Je suis au courant de divers modules tels que Beautiful Soup, mais a décidé d'aller dans le chemin de ne pas dépendre de "l'extérieur" des modules. Il existe un code fourni par Eloff: Strip HTML à partir de chaînes en Python

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()

fonctionne en python 3.1. Cependant, j'ai récemment mis à jour en Python 3.2.x et ont constaté que je reçois des erreurs concernant le code HTML de L'Analyseur tel qu'il est écrit ci-dessus.

ma première erreur pointe vers la ligne:

s.feed(html)

... et le message d'erreur indique ...

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

donc, après un peu de recherche, j'ajoute" strict=True " à la ligne supérieure, ce qui le rend...

class MLStripper(HTMLParser, strict=True)

cependant, je reçois la nouvelle erreur de:

TypeError: type() takes 1 or 3 arguments

pour voir ce qui se passerait, j'ai retiré l'argument "self" et laissé dans le "stricte=True"... qui a renoncé à l'erreur:

NameError: global name 'self' is not defined

... et j'ai eu le sentiment "je devine sur des conjectures".

Je n'ai aucune idée de ce que serait le troisième argument dans la ligne class MLStripper(HTMLParser) , après self et strict=True ; la recherche n'a pas jeté tout éclaircissement.

13
demandé sur Community 2012-06-16 09:21:48

1 réponses

vous sous-classez HTMLParser , mais vous n'appelez pas sa méthode __init__ . Vous devez ajouter une ligne à votre méthode __init__ :

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

aussi, pour Python 3, la ligne d'importation est:

from html.parser import HTMLParser

avec ces modifications, un exemple simple fonctionne. Ne changez pas la ligne class , ce n'est pas lié.

25
répondu Thomas K 2012-06-16 13:26:17