2010-06-17 3 views

Répondre

3

Je devrais reformuler ma réponse.

Les massages intégrés sont bons pour les dommages légers (espaces supplémentaires, pas de barres obliques, etc.). J'essaierais certainement de m'en débarrasser avant de m'impliquer davantage.

Vous pouvez pass in your own massages et je vous suggère de prolonger le jeu par défaut:

import copy, re 

myMassage = [(re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1))] 
myNewMassage = copy.copy(BeautifulSoup.MARKUP_MASSAGE) 
myNewMassage.extend(myMassage) 

BeautifulSoup(badString, markupMassage=myNewMassage) 
# Foo<!--This comment is malformed.-->Bar<br />Baz 

Vous êtes probablement mieux ce faire de cette façon que tout va dans un pot d'analyse syntaxique, gagnant BeautifulSoups ... Bien que Optimisations la performance d'exécution est probablement assez similaire.

2

À partir de the documentation, les méthodes de massage ne sont que des paires de (regular expression, replacement function) donc je ne pense pas que ce soit vraiment un cas d'utilisation de massages ou d'expressions rationnelles.

par exemple. pour ranger les commentaires malformés:

(re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1)) 

Si vous regardez la source de la méthode dans BeautifulSoup.py vous verrez que ceux-ci sont lancées juste en séquence contre le balisage:

for fix, m in self.markupMassage: 
    markup = fix.sub(m, markup) 

Ainsi, alors que vous pourriez faire un certain traitement de regexp de votre propre avant que BeautifulSoup arrive à voir le balisage, vous êtes probablement mieux combiner tout rangement supplémentaire nécessaire avec le MARKUP_MASSAGE intégré par défaut comme indiqué dans Oli's réponse.