Eliminar HTML de cadenas en Python

from mechanize import Browser br = Browser() br.open('http://somewebpage') html = br.response().readlines() for line in html: print line 

Al imprimir una línea en un archivo HTML, estoy tratando de encontrar una manera de mostrar solo el contenido de cada elemento HTML y no el formato en sí. Si encuentra 'some text' , solo imprimirá ‘algo de texto’, 'hello' imprime ‘hola’, etc. ¿Cómo Uno va por hacer esto?

Siempre usé esta función para eliminar las tags HTML, ya que solo requiere el stdlib de Python:

En Python 2

 from HTMLParser import HTMLParser class MLStripper(HTMLParser): def __init__(self): self.reset() self.fed = [] def handle_data(self, d): self.fed.append(d) def get_data(self): return ''.join(self.fed) def strip_tags(html): s = MLStripper() s.feed(html) return s.get_data() 

Para Python 3

 from html.parser import HTMLParser class MLStripper(HTMLParser): def __init__(self): self.reset() self.strict = False self.convert_charrefs= True self.fed = [] def handle_data(self, d): self.fed.append(d) def get_data(self): return ''.join(self.fed) def strip_tags(html): s = MLStripper() s.feed(html) return s.get_data() 

Nota : esto funciona solo para 3.1. Para 3.2 o superior, debe llamar a la función init de la clase padre. Ver Usar HTMLParser en Python 3.2

No he pensado mucho en los casos que fallará, pero puedes hacer una ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xpresión regular simple:

 re.sub('<[^<]+?>', '', tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) 

Para aquellos que no entienden las ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xpresiones regulares, esto busca una cadena <...> , donde el contenido interno está formado por uno o más caracteres ( + ) que no es un < . El ? significa que coincidirá con la cadena más pequeña que pueda encontrar. Por ejemplo, dado

Hello

, coincidirá con <'p> y

separado con el ? . Sin él, coincidirá con toda la cadena <..Hello..> .

Si no aparece la etiqueta < en html (p. Ej., 2 < 3 ), debe escribirse como una secuencia de escape &... todos modos, así que la ^< puede ser innecesaria.

¿Por qué todos ustedes lo hacen de la manera difícil? Puede utilizar la función BeautifulSoup get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt() .

 from bs4 import BeautifulSoup html_str = ''' Please can you strip me? 
I am waiting.... ''' soup = BeautifulSoup(html_str) print(soup.get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt()) #or via attribute of Soup Object: print(soup.tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt)

¡Version corta!

 import re, cgi tag_re = re.compile(r'(|<[^>]*>)') # Remove well-formed tags, fihttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xing mistakes by legitimate users no_tags = tag_re.sub('', user_input) # Clean up anything else by escaping ready_for_web = cgi.escape(no_tags) 

Fuente Regehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x: MarkupSafe . Su versión también maneja las entidades HTML, mientras que esta rápida no lo hace.

¿Por qué no puedo simplemente quitar las tags y dejarlas?

Una cosa es evitar que la gente italicizing cosas, sin dejar que flote por ahí. Pero es otra cosa tomar una entrada arbitraria y hacerla completamente inofensiva. La mayoría de las técnicas en esta página dejarán intactos los comentarios no cerrados ( src=https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x onerror=alert(1);//>

La primera vez que HTMLParser lo ve, no puede decir que es una etiqueta. Parece roto, por lo que HTMLParser no se deshace de él. Sólo saca el , dejándote con

  

Este problema se reveló al proyecto Django en marzo de 2014. Sus antiguos strip_tags eran esencialmente los mismos que la respuesta principal a esta pregunta. Su nueva versión básicamente lo ejecuta en un bucle hasta que ejecutarlo de nuevo no cambia la cadena:

 # _strip_once runs HTMLParser once, pulling out just the tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt of all the nodes. def strip_tags(value): """Returns the given HTML with all tags stripped.""" # Note: in typical case this loop ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xecutes _strip_once once. Loop condition # is redundant, but helps to reduce number of ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xecutions of _strip_once. while '<' in value and '>' in value: new_value = _strip_once(value) if len(new_value) >= len(value): # _strip_once was not able to detect more tags break value = new_value return value 

Por supuesto, nada de esto es un problema si siempre se escapa del resultado de strip_tags() .

Actualización del 19 de marzo de 2015 : hubo un error en las versiones de Django anteriores a 1.4.20, 1.6.11, 1.7.7 y 1.8c1. Estas versiones podrían ingresar a un bucle infinito en la función strip_tags (). La versión fija se reproduce arriba. Más detalles aquí .

Buenas cosas para copiar o usar

El código de mi ejemplo no controla las entidades HTML: las versiones empaquetadas de Django y MarkupSafe sí lo hacen.

Mi código de ejemplo se ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtrae de la ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcelente biblioteca MarkupSafe para la prevención de secuencias de comandos entre sitios. Es conveniente y rápido (con aceleraciones de C a su versión nativa de Python). Se incluye en Google App Engine y es utilizado por Jinja2 (2.7 y versiones superiores) , Mako, Pylons y más. Funciona fácilmente con las plantillas Django de Django 1.7.

Las strip_tags de Django y otras utilidades html de una versión reciente son buenas, pero las encuentro menos convenientes que MarkupSafe. Son bastante independientes, podría copiar lo que necesita de este archivo .

Si necesita eliminar casi todas las tags, la biblioteca Bleach es buena. Puede hacer que aplique reglas como “mis usuarios pueden poner en cursiva las cosas, pero no pueden hacer iframes”.

¡Comprende las propiedades de tu tag stripper! Ejecutar pruebas fuzz en él! Aquí está el código que solía hacer la investigación para esta respuesta.

nota tímida : la pregunta en sí misma es sobre la impresión en la consola, pero este es el resultado principal de Google para “python strip html from string”, por lo que esta es la respuesta al 99% sobre la web.

Necesitaba una forma de quitar las tags y decodificar las entidades HTML a tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto sin formato. La siguiente solución se basa en la respuesta de Eloff (que no pude usar porque elimina las entidades).

 from HTMLParser import HTMLParser import htmlentitydefs class HTMLTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtEhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtractor(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.result = [ ] def handle_data(self, d): self.result.append(d) def handle_charref(self, number): codepoint = int(number[1:], 16) if number[0] in (u'http://sofes.miximages.com/python/x', u'X') else int(number) self.result.append(unichr(codepoint)) def handle_entityref(self, name): codepoint = htmlentitydefs.name2codepoint[name] self.result.append(unichr(codepoint)) def get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(self): return u''.join(self.result) def html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html): s = HTMLTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtEhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtractor() s.feed(html) return s.get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt() 

Una prueba rápida:

 html = u'Demo (¬ \u0394&#https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x03b7;μ&#https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x03CE;)' print repr(html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html)) 

Resultado:

 u'Demo (\https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xac \u0394\u03b7\u03bc\u03ce)' 

Manejo de errores:

  • La estructura de HTML no válida puede causar un error HTMLParseError .
  • Las entidades HTML con nombre no válidas (como &#apos; que son válidas en XML y XHTML, pero no en HTML simple) causarán una ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcepción ValueError .
  • Las entidades HTML numéricas que especifican puntos de código fuera del rango Unicode aceptable por Python (como, en algunos sistemas, caracteres fuera del plano multilingüe básico ) causarán una ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcepción ValueError .

Nota de seguridad: no confunda la eliminación de HTML (conversión de HTML en tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto sin formato) con la limpieza de HTML (conversión de tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto sin formato en HTML). Esta respuesta eliminará HTML y decodificará las entidades en tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto simple, lo que no hace que el resultado sea seguro para usar en un contehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto HTML.

Ejemplo: <script>alert("Hello");</script> se convertirá en , que es 100% correcto, pero obviamente no es suficiente si el tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto sin formato resultante se inserta como está en una página HTML.

La regla no es difícil: cada vez que inserte una cadena de tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto sin formato en la salida HTML, siempre debe escapar de HTML (usando cgi.escape(s, True) ), incluso si “sabe” que no contiene HTML (por ejemplo, porque ha eliminado el contenido HTML).

(Sin embargo, el OP preguntó acerca de la impresión del resultado en la consola, en cuyo caso no es necesario que se escape HTML).

Versión de Python 3.4+: (con doctest!)

 import html.parser class HTMLTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtEhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtractor(html.parser.HTMLParser): def __init__(self): super(HTMLTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtEhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtractor, self).__init__() self.result = [ ] def handle_data(self, d): self.result.append(d) def get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(self): return ''.join(self.result) def html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html): """Converts HTML to plain tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt (stripping tags and converting entities). >>> html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt('Demo (¬ \u0394&#https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x03b7;μ&#https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x03CE;)') 'Demo (\https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xac \u0394\u03b7\u03bc\u03ce)' "Plain tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt" doesn't mean result can safely be used as-is in HTML. >>> html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt('<script>alert("Hello");</script>') '' Always use html.escape to sanitize tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt before using in an HTML contehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt! HTMLParser will do its best to make sense of invalid HTML. >>> html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt('https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x < y &lt z 

Hay una forma simple de esto:

 def remove_html_markup(s): tag = False quote = False out = "" for c in s: if c == '<' and not quote: tag = True elif c == '>' and not quote: tag = False elif (c == '"' or c == "'") and tag: quote = not quote elif not tag: out = out + c return out 

La idea se ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xplica aquí: http://youtu.be/2tu9LTDujbw

Puedes verlo trabajando aquí: http://youtu.be/HPkNPcYed9M?t=35s

PD: si está interesado en la clase (sobre la depuración inteligente con python), le doy un enlace: http://www.udacity.com/overview/Course/cs259/CourseRev/1 . ¡Es gratis!

¡De nada! 🙂

Si necesita conservar las entidades HTML (es decir, & ), agregué el método “handle_entityref” a la respuesta de Eloff .

 from HTMLParser import HTMLParser class MLStripper(HTMLParser): def __init__(self): self.reset() self.fed = [] def handle_data(self, d): self.fed.append(d) def handle_entityref(self, name): self.fed.append('&%s;' % name) def get_data(self): return ''.join(self.fed) def html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html): s = MLStripper() s.feed(html) return s.get_data() 

Si desea eliminar todas las tags HTML, la forma más sencilla que encontré es usar BeautifulSoup:

 from bs4 import BeautifulSoup # Or from BeautifulSoup import BeautifulSoup def stripHtmlTags(htmlThttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt): if htmlThttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt is None: return None else: return ''.join(BeautifulSoup(htmlThttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt).findAll(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt=True)) 

Probé el código de la respuesta aceptada pero obtuve “RuntimeError: se ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcedió la profundidad máhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xima de recursión”, lo que no ocurrió con el bloque de código anterior.

Una solución basada en lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml.html (lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml es una biblioteca nativa y, por lo tanto, mucho más rápida que cualquier solución Python pura).

 from lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml import html from lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml.html.clean import clean_html tree = html.fromstring(""" Detailed answers to any questions you might have """) print(clean_html(tree).strip()) # >>> Detailed answers to any questions you might have 

También vea http://lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml.de/lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xmlhtml.html#cleaning-up-html para saber ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xactamente qué hace lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml.cleaner.

Si necesita más control sobre qué es ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xactamente el desinfectado antes de convertirlo en tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto, es posible que desee utilizar el limpiador lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xplícitamente al pasar las opciones que desea en el constructor, por ejemplo:

 cleaner = Cleaner(page_structure=True, meta=True, embedded=True, links=True, style=True, processing_instructions=True, inline_style=True, scripts=True, javascript=True, comments=True, frames=True, forms=True, annoying_tags=True, remove_unknown_tags=True, safe_attrs_only=True, safe_attrs=frozenset(['src','color', 'href', 'title', 'class', 'name', 'id']), remove_tags=('span', 'font', 'div') ) sanitized_html = cleaner.clean_html(unsafe_html) 

El paquete Beautiful Soup hace esto inmediatamente por ti.

 from bs4 import BeautifulSoup soup = BeautifulSoup(html) tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = soup.get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt() print(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) 

Puede usar un analizador HTML diferente ( como lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml o Beautiful Soup ), uno que ofrece funciones para ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtraer solo tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto. O bien, puede ejecutar una ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xpresión regular en su cadena de línea que elimina las tags. Consulte http://www.amk.ca/python/howto/regehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x/ para obtener más información.

He utilizado con éhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xito la respuesta de Eloff para Python 3.1 [muchas gracias!].

Actualicé a Python 3.2.3 y me encontré con errores.

La solución, proporcionada aquí gracias al respondedor Thomas K, es insertar super().__init__() en el siguiente código:

 def __init__(self): self.reset() self.fed = [] 

… para que se vea así:

 def __init__(self): super().__init__() self.reset() self.fed = [] 

… y funcionará para Python 3.2.3.

Nuevamente, gracias a Thomas K por la corrección y por el código original de Eloff que se proporciona arriba.

Las soluciones con HTML-Parser se pueden romper, si se ejecutan solo una vez:

 html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt('<script>alert("hacked")</script> 

resultados en:

  

Lo que pretendes prevenir. Si usa un analizador HTML, cuente las tags hasta que se reemplacen los cero:

 from HTMLParser import HTMLParser class MLStripper(HTMLParser): def __init__(self): self.reset() self.fed = [] self.containstags = False def handle_starttag(self, tag, attrs): self.containstags = True def handle_data(self, d): self.fed.append(d) def has_tags(self): return self.containstags def get_data(self): return ''.join(self.fed) def strip_tags(html): must_filtered = True while ( must_filtered ): s = MLStripper() s.feed(html) html = s.get_data() must_filtered = s.has_tags() return html 

Esta es una solución rápida y puede optimizarse aún más, pero funcionará bien. Este código reemplazará todas las tags que no estén vacías con “” y elimina todas las tags html que forman un tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto de entrada dado. Puede ejecutarlo usando la entrada de entrada ./file.py

  #!/usr/bin/python import sys def replace(strng,replaceTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt): rpl = 0 while rpl > -1: rpl = strng.find(replaceTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) if rpl != -1: strng = strng[0:rpl] + strng[rpl + len(replaceTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt):] return strng lessThanPos = -1 count = 0 listOf = [] try: #write File writeto = open(sys.argv[2],'w') #read file and store it in list f = open(sys.argv[1],'r') for readLine in f.readlines(): listOf.append(readLine) f.close() #remove all tags for line in listOf: count = 0; lessThanPos = -1 lineTemp = line for char in lineTemp: if char == "<": lessThanPos = count if char == ">": if lessThanPos > -1: if line[lessThanPos:count + 1] != '<>': lineTemp = replace(lineTemp,line[lessThanPos:count + 1]) lessThanPos = -1 count = count + 1 lineTemp = lineTemp.replace("&lt","<") lineTemp = lineTemp.replace("&gt",">") writeto.write(lineTemp) writeto.close() print "Write To --- >" , sys.argv[2] ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcept: print "Help: invalid arguments or ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xception" print "Usage : ",sys.argv[0]," inputfile outputfile" 

Una adaptación de python 3 de la respuesta de søren-løvborg.

 from html.parser import HTMLParser from html.entities import html5 class HTMLTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtEhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtractor(HTMLParser): """ Adaption of http://stackoverflow.com/a/7778368/196732 """ def __init__(self): super().__init__() self.result = [] def handle_data(self, d): self.result.append(d) def handle_charref(self, number): codepoint = int(number[1:], 16) if number[0] in (u'http://sofes.miximages.com/python/x', u'X') else int(number) self.result.append(unichr(codepoint)) def handle_entityref(self, name): if name in html5: self.result.append(unichr(html5[name])) def get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(self): return u''.join(self.result) def html_to_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html): s = HTMLTehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtEhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtractor() s.feed(html) return s.get_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt() 

Para un proyecto, necesitaba el código HTML, pero también css y js. Así, hice una variación de la respuesta de Eloffs:

 class MLStripper(HTMLParser): def __init__(self): self.reset() self.strict = False self.convert_charrefs= True self.fed = [] self.css = False def handle_starttag(self, tag, attrs): if tag == "style" or tag=="script": self.css = True def handle_endtag(self, tag): if tag=="style" or tag=="script": self.css=False def handle_data(self, d): if not self.css: self.fed.append(d) def get_data(self): return ''.join(self.fed) def strip_tags(html): s = MLStripper() s.feed(html) return s.get_data() 

Aquí hay una solución similar a la respuesta actualmente aceptada ( https://stackoverflow.com/a/925630/95989 ), ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcepto que usa la clase interna HTMLParser directamente (es decir, sin subclasificación), por lo que es significativamente más terso:

 def strip_html (tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto):
     partes = []                                                                      
     analizador = HTMLParser ()                                                           
     parser.handle_data = parts.append                                               
     parser.feed (tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto)                                                               
     devuelve '' .join (partes)

Puedes escribir tu propia función:

 def StripTags(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt): finished = 0 while not finished: finished = 1 start = tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt.find("<") if start >= 0: stop = tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt[start:].find(">") if stop >= 0: tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt[:start] + tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt[start+stop+1:] finished = 0 return tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt 

Estoy analizando las lecturas de Github y encuentro que lo siguiente realmente funciona bien:

 import re import lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml.html def strip_markdown(https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x): links_sub = re.sub(r'\[(.+)\]\([^\)]+\)', r'\1', https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x) bold_sub = re.sub(r'\*\*([^*]+)\*\*', r'\1', links_sub) emph_sub = re.sub(r'\*([^*]+)\*', r'\1', bold_sub) return emph_sub def strip_html(https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x): return lhttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xml.html.fromstring(https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x).tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt_content() if https://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/x else '' 

Y entonces

 readme = """ sky is a web scraping framework, implemented with the latest python versions in mind (3.4+). It uses the asynchronous `asyncio` framework, as well as many popular modules and ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xtensions. Most importantly, it aims for **nehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt generation** web crawling where machine intelligence is used to speed up the development/maintainance/reliability of crawling. It mainly does this by considering the user to be interested in content from *domains*, not just a collection of *single pages* ([templating approach](#templating-approach)).""" strip_markdown(strip_html(readme)) 

Elimina todos los markdown y html correctamente.

Usando BeautifulSoup, html2tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt o el código de @Eloff, la mayoría de las veces, sigue siendo algunos elementos html, código javascript …

Por lo tanto, puede usar una combinación de estas bibliotecas y eliminar el formato de reducción de marca (Python 3):

 import re import html2tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt from bs4 import BeautifulSoup def html2Tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html): def removeMarkdown(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt): for current in ["^[ #*]{2,30}", "^[ ]{0,30}\d\\\.", "^[ ]{0,30}\d\."]: markdown = re.compile(current, flags=re.MULTILINE) tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = markdown.sub(" ", tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) return tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt def removeAngular(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt): angular = re.compile("[{][|].{2,40}[|][}]|[{][*].{2,40}[*][}]|[{][{].{2,40}[}][}]|\[\[.{2,40}\]\]") tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = angular.sub(" ", tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) return tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt h = html2tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt.HTML2Tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt() h.images_to_alt = True h.ignore_links = True h.ignore_emphasis = False h.skip_internal_links = True tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = h.handle(html) soup = BeautifulSoup(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt, "html.parser") tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = soup.tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = removeAngular(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = removeMarkdown(tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) return tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt 

Funciona bien para mí, pero puede mejorarse, por supuesto …

Aquí está mi solución para Python 3.

 import html import re def html_to_thttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt(html_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt): ## unescape html thttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt = html.unescape(html_tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) tags = re.findall("<[^>]+>",thttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt) print("found tags: ") print(tags) for tag in tags: thttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt=thttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt.replace(tag,'') return thttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xt 

No estoy seguro de si es perfecto, pero resolvió mi caso de uso y parece simple.

Código simple !. Esto eliminará todo tipo de tags y contenido dentro de él.

 def rm(s): start=False end=False s=' '+s for i in range(len(s)-1): if i': end=i s=s[:start]+s[end+1:] start=end=False else: if s[i]=='<': start=i if s.count('<')>0: self.rm(s) else: s=s.replace(' ', ' ') return s 

Pero no dará un resultado completo si el tehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xto contiene <> símbolos dentro de él.

Este método funciona perfectamente para mí y no requiere instalaciones adicionales:

 import re import htmlentitydefs def convertentity(m): if m.group(1)=='#': try: return unichr(int(m.group(2))) ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcept ValueError: return '&#%s;' % m.group(2) try: return htmlentitydefs.entitydefs[m.group(2)] ehttps://stackoverflow.com/questions/753052/strip-html-from-strings-in-python/xcept KeyError: return '&%s;' % m.group(2) def converthtml(s): return re.sub(r'&(#?)(.+?);',convertentity,s) html = converthtml(html) html.replace(" ", " ") ## Get rid of the remnants of certain formatting(subscript,superscript,etc).