2010-06-01 19 views
11
from lxml.html.clean import clean_html, Cleaner 
    def clean(text): 
     try:   
      cleaner = Cleaner(scripts=True, embedded=True, meta=True, page_structure=True, links=True, style=True, 
         remove_tags = ['a', 'li', 'td']) 
      print (len(cleaner.clean_html(text))- len(text)) 
      return cleaner.clean_html(text) 
     except: 
      print 'Error in clean_html' 
      print sys.exc_info() 
      return text 

Ułożyłem powyższy (brzydki) kod jako moje początkowe wypady w ziemię pytona. Próbuję użyć LXML-a do oczyszczenia kilku stron HTML, więc na końcu pozostało mi tylko tekst i nic więcej - ale spróbuj tak jak ja, powyższe nie wydaje się działać jako takie, jestem pozostało z substial ilości znaczników (i robi to wydaje się być złamane html), a zwłaszcza powiązań, które nie trafiają usunięte, mimo args używam w remove_tags i links=Truepython [lxml] - oczyszczanie znaczników html

jakiś pomysł, co się dzieje, może im szczekanie złe drzewo z lxml? Myślałem, że to jest sposób, aby przejść z parsowania html w Pythona?

+0

nie jestem w stanie powtórzyć ten problem przy użyciu http : //stackoverflow.com/questions/2950131/python-lxml-cleaning-out-html-tags/2950223#2950223 jako dane wejściowe. Czy możesz podać próbkę html i pożądaną wydajność? – unutbu

+0

~ unutbu to jest najdziwniejsze - mam całą bazę danych, w której ten kod nie działa - a mimo to wygląda na to, że działa dobrze teraz? (zrobiłeś coś :)?) ale chociaż jestem na niego, każdy pomysł, w jaki sposób można również wziąć link-tekst, podczas usuwania linku (ponieważ atm pozostawia tekst linków w). –

+0

@sadhu_: 'remove_tags' usuwa same tylko tagi; pozostawia swoje dzieci i tekst. Użyj 'kill_tags', aby usunąć całe drzewo. – jfs

Odpowiedz

5

Myślę, że powinieneś sprawdzić Beautiful Soup. Użyj porady od this article i rozebrać elementy HTML w następujący sposób:

from BeautifulSoup import BeautifulSoup 

''.join(BeautifulSoup(page).findAll(text=True)) 

Gdzie page jest ciąg HTML.

Jeśli potrzebujesz dalszych wyjaśnień, możesz przejrzeć studium przypadku Dive into Python pod numerem HTML parsing.

+3

Wygląda na to, że BS jest przestarzałe (i Google wydaje się sugerować, że lxml jest drogą do przodu ..), więc idealnie chciałem nauczyć się lxml [jako że dokumentacja jest lekko oszałamiająca ..] –

+0

Skały BS! Z 4.0 rc na zewnątrz (kilka miesięcy temu) możesz użyć parsera z 'lxml' lub' html5lib' i zawinąć je w ładnym BS api. – Sergio

12

Nie wiem, czy istnieje metoda ta po raz dokonaniu pytanie, ale jeśli przejdziesz przez

document = lxml.html.document_fromstring(html_text) 
raw_text = document.text_content() 

To powinien zwrócić Ci całą zawartość tekstu w dokumencie HTML, minus wszystkie znaczniki.

+0

Sprawdź odpowiedź Roberta poniżej - link do leniwego http://stackoverflow.com/a/23929354/9908 – David

8

rozwiązanie z David Łączy tekst bez separatora:

import lxml.html 
    document = lxml.html.document_fromstring(html_string) 
    # internally does: etree.XPath("string()")(document) 
    print document.text_content() 

ale ten pomógł mi - konkatenacji drodze mi potrzebne:

from lxml import etree 
    print "\n".join(etree.XPath("//text()")(document)) 
+1

Jest to o wiele bardziej przydatne. – David

Powiązane problemy