2013-04-09 11 views
5

Ich habe viele gelesen q & eine auf, wie Sie den gesamten HTML-Code aus einer Zeichenfolge mit Python entfernen, aber keine war zufriedenstellend. Ich brauche eine Möglichkeit, alle Tags zu entfernen, die HTML-Entitäten zu erhalten/konvertieren und gut mit utf-8-Strings zu arbeiten.Sicher entfernen Sie alle HTML-Code aus einer Zeichenfolge in Python

Offenbar BeautifulSoup ist anfällig für einige speziell gestaltete HTML-Strings, baute ich einen einfachen Parser mit HTMLParser nur die Texte zu bekommen, aber ich verlor die Entitäten

from HTMLParser import HTMLParser 

class MyHTMLParser(HTMLParser): 
    def __init__(self): 
     HTMLParser.__init__(self) 
     self.data = [] 

    def handle_data(self, data): 
     self.data.append(data) 

    def handle_charref(self, name): 
     self.data.append(name) 

    def handle_entityref(self, ent): 
     self.data.append(ent) 

gibt mir so etwas wie

[u'Asia, sp ', U'cialiste du voyage', ...

Verlust der Entität für die Akzent "e" in spécialiste.

Mit einem der vielen Regexp können Sie als Antworten auf ähnliche Fragen immer einige Randfälle finden, die nicht berücksichtigt wurden.

Gibt es ein wirklich gutes Modul, das ich verwenden könnte?

Antwort

4

bleach ist hervorragend für diese Aufgabe. Es tut alles, was Sie brauchen. Es hat eine umfangreiche Test-Suite, die auf seltsame Randfälle prüft, in denen Tags durchschlüpfen könnten. Ich hatte nie ein Problem damit.

+0

bleach.clean (' nicht erlaubt', Streifen = True) könnte dies genau das, was ich brauche, werde ich ein paar Tests mit utf-8, HTML-Entitäten tun, und dass Sachen heute Abend und dann lassen Sie es wissen, danke –

+0

Bleach kann HTML-Entitäten nicht in ihre echte UTF-8-Gegenstück verwandeln. Wenn dies nicht der Fall ist, versuchen Sie diese Frage: http://stackoverflow.com/questions/57708/convert-xml-html-entities-into-unicode-string-in-python –

1

vielleicht pyquery? versuch easy_install/pip install pyquery; dann einige Code wie:

from pyquery import PyQuery as jQ 

dom = jQ("<html>...</html>") 
print dom("body").text() 
Verwandte Themen