2010-08-03 19 views

risposta

28

Se avete intenzione di usare espressioni regolari:

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

Questo funziona solo in modo affidabile su ben formato HTML (cioè, senza escape '' <' or '> al di fuori dei tag effettivi, nessun tag malformati come '

+0

Si prega di aggiungere ulteriori chiarimenti in merito alle situazioni molto limitate in cui sarebbe una buona idea e rimuoveremo il mio voto negativo. Grazie. – Trufa

+4

più questo rimuoverà anche il seguente testo => "if 3 < 5 then 5 > 3" – Shaokan

-1

A seconda che il testo conterrà '>' o '<' avrei sia solo fare una funzione per rimuovere tutto ciò tra coloro, o utilizzare un parsing 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

per quanto ne sappia utilizzando regex è una cattiva idea per il parsing del codice HTML, si sarebbe meglio usando un parser HTML/XML come beautiful soup.

+5

+1 per Beautiful Soup – derekerdmann

+0

Sto usando beautifulsoup, ma voglio essere in grado di rimuovere manualmente anche i tag html. Grazie! – Blankman

+1

@Blankman sarebbe stata una buona idea menzionarlo nella tua domanda – volting

3

Utilizzare SGMLParser. regex funziona in caso semplice. Ma ci sono un sacco di complessità con l'HTML che preferisci non avere a che fare con.

>>> 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

Grazie, ho cercato un po 'di tempo per una soluzione che non richiedesse alcuna dipendenza esterna. Cambiando * ''. Join (ex.text) * in * ''. Join (self.text) * lo rendeva adatto anche come classe autonoma. – hasienda

8

Utilizzare lxml.html. È molto più veloce di BeautifulSoup e il testo non elaborato è un singolo comando.

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

Ottima soluzione, grazie! Usa questo snippet per estrarre il testo dai frammenti HTML: 'lxml.html.fromstring ('some HTML framment'). Text_content()' – Adam

+1

Questa dovrebbe essere la risposta accettata. Usare regex per analizzare HTML (specialmente direttamente su Internet) è un'idea MOLTO ** pessima! –

Problemi correlati