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 

He creado el código anterior (feo) como mis incursiones iniciales en tierra de pitón. Estoy tratando de usar el limpiador lxml para limpiar un par de páginas html, así que al final solo me queda el texto y nada más, pero por más que intente, lo anterior no parece funcionar como tal, estoy siendo la izquierda con una cantidad substial de marcado (y es imposible parece ser roto html), y en particular los vínculos, los cuales no están siendo eliminados, a pesar de los argumentos que utilizo en remove_tags y links=Truepython [lxml] - limpieza de etiquetas html

alguna idea de lo que pasa, tal vez estoy ladrando el árbol equivocado con lxml? Pensé que este era el camino a seguir con el análisis html en Python.

+0

No soy capaz de replicar el problema utilizando HTTP : //stackoverflow.com/questions/2950131/python-lxml-cleaning-out-html-tags/2950223#2950223 como entrada. ¿Podría proporcionar una muestra del html y el resultado deseado? – unutbu

+0

~ unutbu esto es lo más extraño - tengo toda una base de datos donde el código no funcionó - y sin embargo, parece estar funcionando bien ahora? (¿Hiciste algo :)?) pero a la vez, cualquier idea de cómo podrías sacar también el texto del enlace, al quitar el enlace (porque atm deja el texto de los enlaces). –

+0

@sadhu_: 'remove_tags' elimina solo las etiquetas; deja a sus hijos y texto. Usa 'kill_tags' para eliminar todo el árbol. – jfs

Respuesta

5

Creo que deberías echar un vistazo a Beautiful Soup. Utilizar el asesoramiento de this article y tira de los elementos HTML de la siguiente manera:

from BeautifulSoup import BeautifulSoup 

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

Dónde page es su serie de html.

En caso de necesitar más aclaraciones, puede consultar el estudio de caso de inmersión en Python en HTML parsing.

+3

Parece que BS está en desuso (y Google parece sugerir que lxml es el camino a seguir ...) así que, idealmente, quería aprender algo de lxml [ya que la documentación es ligeramente desconcertante ..] –

+0

BS rocks! Con 4.0 rc de salida (hace unos meses) puedes usar el analizador de 'lxml' o' html5lib' y envolverlos en la bonita BS api. – Sergio

12

No estoy seguro si este método existía en torno a la vez que hizo su pregunta, pero si vas a través

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

que se debe devolver todo el contenido del texto en el documento html, menos todo el margen de beneficio.

+0

Eche un vistazo a la respuesta de Robert a continuación - enlace para perezoso http://stackoverflow.com/a/23929354/9908 – David

8

solución de David concatena el texto con ningún separador:

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

pero este me ayudó - concatenación de la forma que necesitaba:

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

Esto es mucho más útil. – David

Cuestiones relacionadas