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.