Strip HTML from strings in Python

Strip HTML from strings in Python

I always used this function to strip HTML tags, as it requires only the Python stdlib:

For Python 3:

from io import StringIO
from html.parser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        super().__init__()
        self.reset()
        self.strict = False
        self.convert_charrefs= True
        self.text = StringIO()
    def handle_data(self, d):
        self.text.write(d)
    def get_data(self):
        return self.text.getvalue()

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()

For Python 2:

from HTMLParser import HTMLParser
from StringIO import StringIO

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.text = StringIO()
    def handle_data(self, d):
        self.text.write(d)
    def get_data(self):
        return self.text.getvalue()

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()

I havent thought much about the cases it will miss, but you can do a simple regex:

re.sub(<[^<]+?>, , text)

For those that dont understand regex, this searches for a string <...>, where the inner content is made of one or more (+) characters that isnt a <. The ? means that it will match the smallest string it can find. For example given <p>Hello</p>, it will match <p> and </p> separately with the ?. Without it, it will match the entire string <..Hello..>.

If non-tag < appears in html (eg. 2 < 3), it should be written as an escape sequence &... anyway so the ^< may be unnecessary.

Strip HTML from strings in Python

You can use BeautifulSoup get_text() feature.

from bs4 import BeautifulSoup

html_str = 
<td><a href=http://www.fakewebsite.com>Please can you strip me?</a>
<br/><a href=http://www.fakewebsite.com>I am waiting....</a>
</td>

soup = BeautifulSoup(html_str)

print(soup.get_text()) 
#or via attribute of Soup Object: print(soup.text)

It is advisable to explicitly specify the parser, for example as BeautifulSoup(html_str, features=html.parser), for the output to be reproducible.

Leave a Reply

Your email address will not be published. Required fields are marked *