2010-06-17 6 views

Antwort

3

Ich dachte, ich sollte meine Antwort umschreiben.

Die eingebauten Massagen sind gut für leichten Schaden (zusätzliches Leerzeichen, keine Schliessungen usw.). Ich würde sicherlich versuchen, mit diesen durchzukommen, bevor ich noch mehr involviert werde.

Sie können pass in your own massages und ich würde Sie den Standardsatz vorschlagen erweitern:

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 

Du bist wahrscheinlich besser dran, es auf diese Weise zu tun, wie sie alle in einem Parsing-Topf geht, BeautifulSoups Optimierungen gewinnt ... Obwohl Die Laufzeitleistung ist wahrscheinlich ziemlich ähnlich.

2

Von the documentation, Massage-Methoden sind nur Paare von (regular expression, replacement function), so glaube ich nicht, es ist wirklich ein Fall von Massage oder Regexs verwenden.

z.B. malformed Kommentare aufzuräumen:

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

Wenn Sie an der Quelle des Methode in BeautifulSoup.py anschauen, werden Sie sehen, dass diese nur in Folge gegen die Auszeichnungs laufen:

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

Während also Sie können einige eigene Regexp-Verarbeitungen durchführen, bevor BeautifulSoup das Markup sehen kann. Sie sind wahrscheinlich besser in der Lage, alle zusätzlichen Aufräumarbeiten zu kombinieren, die mit dem Standard-Build MARKUP_MASSAGE benötigt werden, wie in Oli's gezeigt.