Strip HTML from strings in Python Strip HTML from strings in Python python 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 StringIOfrom html.parser import HTMLParserclass 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 HTMLParserfrom StringIO import StringIOclass 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 haven't thought much about the cases it will miss, but you can do a simple regex:

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

For those that don't understand regex, this searches for a string <...>, where the inner content is made of one or more (+) characters that isn't 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.


You can use BeautifulSoup get_text() feature.

from bs4 import BeautifulSouphtml_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.