Ответ 1
Если вы собираетесь использовать регулярное выражение:
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!'
У меня есть строка, которая содержит html-разметку, например ссылки, жирный текст и т.д.
Я хочу удалить все теги, чтобы у меня был только исходный текст.
Какой лучший способ сделать это? регулярное выражение?
Если вы собираетесь использовать регулярное выражение:
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!'
AFAIK с использованием regex - плохая идея для синтаксического анализа HTML, вам было бы лучше используя синтаксический анализатор HTML/XML, например красивый суп.
Используйте lxml.html. Это намного быстрее, чем BeautifulSoup, а сырой текст - единственная команда.
>>> import lxml.html
>>> page = lxml.html.document_fromstring('<!DOCTYPE html>...</html>')
>>> page.cssselect('body')[0].text_content()
'...'
Используйте SGMLParser
. regex
работает в простом случае. Но есть много сложностей с HTML, с которыми вам, скорее всего, не приходится иметь дело.
>>> 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 > world</html>')
>>> ex.getvalue()
'hello > world'
В зависимости от того, будет ли текст содержать ' > ' или '<' Я бы либо просто сделал функцию, чтобы удалить что-нибудь между ними, либо использовать разбор 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])