2010-06-01 17 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 

Ich habe den obigen (hässlichen) Code als meine ersten Streifzüge in Python Land. Ich versuche, LXML-Reiniger zu verwenden, um ein paar HTML-Seiten zu säubern, so am Ende bin ich nur mit dem Text und nichts anderes übrig - aber versuchen Sie, wie ich könnte, das obige scheint nicht so zu funktionieren, ich bin noch links mit einer substial Menge von Markup (und es funktioniert nicht gebrochen html zu sein scheint), und insbesondere Verbindungen, die nicht entfernt zu werden, trotz des args ich verwende in remove_tags und links=Truepython [lxml] - reinigung html tags

eine Ahnung, was los ist, vielleicht Ich bellte den falschen Baum mit lxml? Ich dachte, das war der Weg, mit HTML-Parsing in Python zu gehen?

+0

Ich bin nicht in der Lage, das Problem zu replizieren mit http : //stackoverflow.com/questions/2950131/python-lxml-cleaning-out-html-tags/2950223#2950223 als Eingabe. Könnten Sie ein Beispiel für den HTML-Code und die gewünschte Ausgabe bereitstellen? – unutbu

+0

~ unutbu das ist am seltsamsten - ich habe eine ganze Datenbank wo dieser Code nicht funktioniert hat - und doch scheint es jetzt gut zu funktionieren? (Hast du etwas gemacht :)?) aber während ich es bin, irgendeine Idee, wie Sie auch den Link-Text herausnehmen können, wenn Sie den Link entfernen (weil atm es den Text der Links in verlässt). –

+0

@sadhu_: 'remove_tags' entfernt nur Tags selbst; Es hinterlässt seine Kinder und Text. Verwenden Sie 'kill_tags', um den gesamten Baum zu entfernen. – jfs

Antwort

5

Ich denke, Sie sollten Beautiful Soup überprüfen. Verwenden Sie den Rat von this article und isolieren Sie die HTML-Elemente auf folgende Weise:

from BeautifulSoup import BeautifulSoup 

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

Wo page Ihre HTML-String ist.

Sollten Sie weitere Erläuterungen benötigen, können Sie die Fallstudie zu Dive in Python unter HTML parsing lesen.

+3

Es scheint BS ist veraltet (und googling scheint lxml ist der Weg nach vorne ..) Also idealerweise wollte ich etwas lxml lernen [wie die Dokumentation ist leicht verwirrend ..] –

+0

BS rockt! Mit 4.0 rc out (vor ein paar Monaten) können Sie den Parser von 'lxml' oder' html5lib' verwenden und in die nice BS API umwandeln. – Sergio

12

nicht sicher, ob diese Methode um die Zeit existierte Sie Ihre Frage gestellt, aber wenn man

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

Das sollten Sie alle Textinhalt im HTML-Dokument zurückzukehren, minus all das Markup.

+0

Überprüfen Sie Robert Antwort unten - Link für faul http://stackoverflow.com/a/23929354/9908 – David

8

Lösung von David verkettet den Text ohne Trennzeichen:

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

aber dieses hat mir geholfen - Verkettung der Art, wie ich brauchte:

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

Dies ist viel nützlicher. – David