2009-02-28 2 views
6

Wie kann ich den gesamten HTML-Code aus einer Zeichenfolge in Python entfernen? Zum Beispiel, wie kann ich mich wenden:Python-HTML-Entfernung

blah blah <a href="blah">link</a> 

in

blah blah link 

Dank!

>>> import re 
>>> s = 'blah blah <a href="blah">link</a>' 
>>> re.sub('<[^>]*>', '', s) 
'blah blah link' 
+0

Könnte Overkill für Ihre Zwecke sein, aber BeautifulSoup einen Versuch geben, wenn Ihre Strings komplizierter oder falsch formatiert HTML haben. Vorbehalt: Ich denke nicht, dass es für Python 3.0 noch verfügbar ist. – bernie

Antwort

7

Sie können einen regulären Ausdruck, die Tags alle entfernen verwenden. Wirf alles weg mit Ausnahme des Textes.

+0

Sie können Ihre Regex auf '<.*?>' vereinfachen, die die gleichen Ergebnisse erzielt, aber das geht richtig formatiert HTML, wie Sie Ihre. – UnkwnTech

+0

Müssen Sie nach quotierten> suchen, oder sind diese nicht erlaubt? Kannst du oder so etwas haben? –

+0

@Unkwntech: Ich bevorzuge <[^>] *> über <.*?>, da der ehemalige nicht zurückverfolgen muss, um das Ende des Tags zu finden. –

0
>>> import re 
>>> s = 'blah blah <a href="blah">link</a>' 
>>> q = re.compile(r'<.*?>', re.IGNORECASE) 
>>> re.sub(q, '', s) 
'blah blah link' 
18

Wenn Ihre reguläre Ausdruck Lösung, die eine Wand trifft, versuchen Sie dieses super einfach (und zuverlässig) BeautifulSoup Programm.

from BeautifulSoup import BeautifulSoup 

html = "<a> Keep me </a>" 
soup = BeautifulSoup(html) 

text_parts = soup.findAll(text=True) 
text = ''.join(text_parts) 
+0

BeautifulSoup trifft auch auf die gleiche Wand. Siehe http://stackoverflow.com/questions/598817/python-html-removal/600471#600471 – jfs

10

Es gibt auch eine kleine Bibliothek namens stripogram, die verwendet werden können einige oder alle HTML-Tags abzustreifen.

Sie können es wie folgt verwenden:

from stripogram import html2text, html2safehtml 
# Only allow <b>, <a>, <i>, <br>, and <p> tags 
clean_html = html2safehtml(original_html,valid_tags=("b", "a", "i", "br", "p")) 
# Don't process <img> tags, just strip them out. Use an indent of 4 spaces 
# and a page that's 80 characters wide. 
text = html2text(original_html,ignore_tags=("img",),indent_width=4,page_width=80) 

Also, wenn Sie alle HTML-Streifen aus einfach wollen, übergeben Sie valid_tags =() auf die erste Funktion.

Sie können die documentation here finden.

2

html2text wird so etwas tun.

+0

html2text eignet sich hervorragend für schön formatierte, lesbare Ausgabe ohne einen zusätzlichen Schritt. Wenn alle HTML-Zeichenfolgen, die Sie konvertieren müssen, so einfach sind wie Ihr Beispiel, dann ist BeautifulSoup der richtige Weg. Wenn es komplexer ist, kann html2text die lesbare Absicht des Originals gut bewahren. –

5

regexs, BeautifulSoup, html2text funktionieren nicht wenn ein Attribut '>' in ihm hat. Siehe Is “>” (U+003E GREATER-THAN SIGN) allowed inside an html-element attribute value?

"HTML/XML-Parser" -basierte Lösung könnte in solchen Fällen helfen, z. B. funktioniert stripogramsuggested by @MrTopf funktioniert.

Hier ElementTree -basierte Lösung:

####from xml.etree import ElementTree as etree # stdlib 
from lxml import etree 

str_ = 'blah blah <a href="blah">link</a> END' 
root = etree.fromstring('<html>%s</html>' % str_) 
print ''.join(root.itertext()) # lxml or ElementTree 1.3+ 

Ausgang:

blah blah link END 
1

ich das gerade geschrieben. Ich brauche es. Es verwendet html2text und nimmt einen Dateipfad, obwohl ich eine URL bevorzugen würde. Die Ausgabe von html2text wird in TextFromHtml2Text.text gespeichert drucken Sie es, speichern Sie es, füttern Sie es zu Ihrem Haustier Kanarienvogel.

import html2text 
class TextFromHtml2Text: 

    def __init__(self, url = ''): 
     if url == '': 
      raise TypeError("Needs a URL") 
     self.text = "" 
     self.url = url 
     self.html = "" 
     self.gethtmlfile() 
     self.maytheswartzbewithyou() 

    def gethtmlfile(self): 
     file = open(self.url) 
     for line in file.readlines(): 
      self.html += line 

    def maytheswartzbewithyou(self): 
     self.text = html2text.html2text(self.html) 
+0

Sie könnten dies auch einfach als 'importieren schreiben urllib, html2text [break] def get_text_from_html_url (url): [break] return html2text.html2text (urllib.urlopen (url) .read()) 'kürzer und sauberer –

1

Es gibt eine einfache Möglichkeit, dies:

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 

Die Idee hier erklärt: http://youtu.be/2tu9LTDujbw

Sie können es sehen, hier zu arbeiten: http://youtu.be/HPkNPcYed9M?t=35s

PS - Wenn Sie Interesse an der Klasse (über Smart-Debugging mit Python) Ich gebe Ihnen einen Link: http://www.udacity.com/overview/Course/cs259/CourseRev/1. Es ist kostenlos!

Gern geschehen! :)