2010-08-03 28 views

Respuesta

28

Si se va a utilizar expresiones regulares:

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

>>> striphtml('<a href="foo.com" class="bar">I Want This <b>text!</b></a>') 
'I Want This text!' 
+1

Esto sólo funcionará HTML de forma fiable en bien formada (es decir, no sin escape '' <' or '> fuera de etiquetas reales, no hay etiquetas mal formados como '

+0

Agregue más aclaraciones sobre las situaciones muy limitadas en las que sería una buena idea y eliminaré mi voto negativo. Gracias. – Trufa

+4

más esto también eliminará el siguiente texto => "si 3 < 5 then 5 > 3" – Shaokan

-1

Dependiendo de si el texto contendrá '>' o '<' Yo ya sea simplemente hacer una función para eliminar cualquier cosa entre ellos, o utilizar un análisis sintáctico lib

def cleanStrings(self, inStr): 
    a = inStr.find('<') 
    b = inStr.find('>') 
    if a < 0 and b < 0: 
    return inStr 
    return cleanString(inStr[a:b-a]) 
10

yo sepa el uso de expresiones regulares es una mala idea para análisis de HTML, que estaría mejor usando un analizador de HTML/XML como beautiful soup.

+5

+1 para Beautiful Soup – derekerdmann

+0

Estoy usando beautifulsoup, pero también quiero poder pegar etiquetas html manualmente. ¡Gracias! – Blankman

+1

@Blankman hubiera sido una buena idea mencionar que en su pregunta – volting

3

Use SGMLParser. regex funciona en caso simple. Pero hay una gran cantidad de complejidad con HTML con la que no tienes que lidiar.

>>> from sgmllib import SGMLParser 
>>> 
>>> class TextExtracter(SGMLParser): 
...  def __init__(self): 
...   self.text = [] 
...   SGMLParser.__init__(self) 
...  def handle_data(self, data): 
...   self.text.append(data) 
...  def getvalue(self): 
...   return ''.join(ex.text) 
... 
>>> ex = TextExtracter() 
>>> ex.feed('<html>hello &gt; world</html>') 
>>> ex.getvalue() 
'hello > world' 
+0

Gracias, he estado buscando una solución que no requiere dependencia externa. Cambiar * ''. Join (ex.text) * en * ''. Join (self.text) * lo hizo adecuado incluso como una clase independiente. – hasienda

8

Use lxml.html. Es mucho más rápido que BeautifulSoup y el texto sin procesar es un solo comando.

>>> import lxml.html 
>>> page = lxml.html.document_fromstring('<!DOCTYPE html>...</html>') 
>>> page.cssselect('body')[0].text_content() 
'...' 
+2

¡Gran solución, gracias! Utilice este fragmento para extraer texto de fragmentos HTML: 'lxml.html.fromstring ('algún fragmento de HTML'). Text_content()' – Adam

+1

Esta debería ser la respuesta aceptada. El uso de expresiones regulares para analizar HTML (especialmente directamente de Internet) es una idea MUY ** mala **. –

Cuestiones relacionadas