2013-04-09 12 views
5

Czytałem wiele q & o tym, jak usunąć cały kod html z ciągu za pomocą python, ale żaden nie był satysfakcjonujący. Potrzebuję sposobu na usunięcie wszystkich tagów, zachowanie/przekonwertowanie elementów html i działa dobrze z ciągami utf-8.Bezpiecznie usuń cały kod z łańcucha w pytonie

Widocznie BeautifulSoup jest podatny na niektórych specjalnie spreparowanych ciągów HTML, zbudowałem prosty parser z HTMLParser dostać tylko teksty, ale traciłem podmiotów

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) 

daje mi coś takiego

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

utrata istoty dla akcentowanego "e" w spécialiste.

Korzystanie z jednego z wielu wyrażeń regularnych, które można znaleźć jako odpowiedzi na podobne pytania, zawsze będzie miało kilka przypadków skrajnych, które nie zostały uwzględnione.

Czy istnieje naprawdę dobry moduł, którego mógłbym użyć?

Odpowiedz

4

bleach doskonale nadaje się do tego zadania. Robi wszystko, czego potrzebujesz. Ma obszerny zestaw testów, który sprawdza dziwne przypadki krawędzi, w których znaczniki mogą się przedostać. Nigdy nie miałem z tym problemu.

+0

bleach.clean (' jest niedozwolone', pas = True) To może być dokładnie to, co trzeba, zrobię kilka testów z UTF-8, i że podmioty html rzeczy dziś wieczorem, a następnie dajcie znać, dzięki –

+0

Bleach nie może przekształcić encji HTML w ich prawdziwy odpowiednik UTF-8. Jeśli nie, wypróbuj to pytanie: http://stackoverflow.com/questions/57708/convert-xml-html-entities-into-unicode-string-in-python –

1

Może pyquery? spróbuj zainstalować łatkę easy_install/pip; potem jakiś kod jak:

from pyquery import PyQuery as jQ 

dom = jQ("<html>...</html>") 
print dom("body").text() 
Powiązane problemy