2012-05-07 28 views
7

He visto una serie de preguntas sobre cómo eliminar etiquetas HTML de las cadenas, pero todavía no estoy muy claro cómo se debe manejar mi caso específico.Eliminar etiquetas de imagen html y todo lo demás de una cadena

He visto que muchas publicaciones desaconsejan el uso de expresiones regulares para manejar HTML, pero sospecho que mi caso puede justificar la elusión juiciosa de esta regla.

Estoy tratando de analizar archivos PDF y he logrado convertir cada página de mi archivo PDF de muestra en una cadena de texto UTF-32. Cuando aparecen imágenes, se inserta una etiqueta de estilo HTML que contiene el nombre y la ubicación de la imagen (que se guarda en otro lugar).

En una parte separada de mi aplicación, necesito deshacerme de estas etiquetas de imagen. Debido a que estamos solo lidiando con etiquetas de imagen, sospecho que el uso de una expresión regular puede estar justificado.

Mi pregunta es doble:

  1. ¿Debo usar una expresión regular para eliminar estas etiquetas, o debería seguir utilizando un módulo de análisis de HTML, como BeautifulSoup?
  2. ¿Qué construcción Regex o BeautifulSoup debo usar? En otras palabras, ¿cómo debería codificar esto?

Para mayor claridad, las etiquetas se estructuran como <img src="/path/to/file"/>

Gracias!

+0

¿Hay algún otro código HTML en este archivo? ¿O es literalmente nada más que texto sin formato y las etiquetas ''? – senderle

+0

@senderle No, no hay HTML además de las etiquetas , de ahí mi indecisión en el uso de una lib de HTML con todas las de la ley. El formato es * siempre * como lo describo arriba. – blz

+0

Acabo de publicar una respuesta, pero me preguntaba, ¿hay realmente un apóstrofo después del cierre> de cada imagen, o fue un error tipográfico? – joshcartme

Respuesta

8

Yo votaría que en su caso es aceptable usar una expresión regular. Algo como esto debería funcionar:

def remove_html_tags(data): 
    p = re.compile(r'<.*?>') 
    return p.sub('', data) 

encontré que aquí fragmento (http://love-python.blogspot.com/2008/07/strip-html-tags-using-python.html)

edición: versión que sólo eliminará las cosas de la forma <img .... />:

def remove_img_tags(data): 
    p = re.compile(r'<img.*?/>') 
    return p.sub('', data) 
+0

También vi esa página antes, pero estoy un poco confundido acerca de la expresión regular en cuestión (tenga en cuenta que sé * nada * sobre la expresión regular utilizar). ¿Por qué la cadena '. *?'? ¿No debería leer algo como ''? – blz

+1

La forma en que la primera que publiqué fue eliminar cualquier cosa entre < and >. Si tuviera otras instancias de < or > en su texto plano (no como etiquetas html), habría eliminado cosas que no deberían tener. Acabo de publicar otra versión que es un poco más selectiva. – joshcartme

+0

¡Genial! Muchas gracias! – blz

3

Dado que este texto contiene sólo etiquetas de imagen, es probable que sea bien usar una expresión regular. Pero para cualquier otra cosa, probablemente sea mejor usar un analizador HTML de buena fe. ¡Afortunadamente Python ofrece uno! Esto es bastante simple: para ser completamente funcional, esto debería manejar muchos más casos de esquina. (. En particular, al estilo XHTML etiquetas vacías (que termina con una barra <... />) no se manejan correctamente aquí)

>>> from HTMLParser import HTMLParser 
>>> 
>>> class TagDropper(HTMLParser): 
...  def __init__(self, tags_to_drop, *args, **kwargs): 
...   HTMLParser.__init__(self, *args, **kwargs) 
...  self._text = [] 
...   self._tags_to_drop = set(tags_to_drop) 
...  def clear_text(self): 
...   self._text = [] 
...  def get_text(self): 
...   return ''.join(self._text) 
...  def handle_starttag(self, tag, attrs): 
...   if tag not in self._tags_to_drop: 
...    self._text.append(self.get_starttag_text()) 
...  def handle_endtag(self, tag): 
...   self._text.append('</{0}>'.format(tag)) 
...  def handle_data(self, data): 
...   self._text.append(data) 
... 
>>> td = TagDropper([]) 
>>> td.feed('A line of text\nA line of text with an <img url="foo"> tag\nAnother line of text with a <br> tag\n') 
>>> print td.get_text() 
A line of text 
A line of text with an <img url="foo"> tag 
Another line of text with a <br> tag 

Y para dejar img etiquetas ...

>>> td = TagDropper(['img']) 
>>> td.feed('A line of text\nA line of text with an <img url="foo"> tag\nAnother line of text with a <br> tag\n') 
>>> print td.get_text() 
A line of text 
A line of text with an tag 
Another line of text with a <br> tag 
+1

¡Brillante, gracias! Creo que iré por la ruta de expresión regular porque parece implicar menos código (¡simplificar, simplificar!). – blz

0

Mi solución es:

def remove_HTML_tag(tag, string): 
    string = re.sub(r"<\b(" + tag + r")\b[^>]*>", r"", string) 
    return re.sub(r"<\/\b(" + tag + r")\b[^>]*>", r"", string) 
Cuestiones relacionadas