Подтвердить что ты не робот

Использование python, удаление HTML-тегов/форматирование из строки

У меня есть строка, которая содержит html-разметку, например ссылки, жирный текст и т.д.

Я хочу удалить все теги, чтобы у меня был только исходный текст.

Какой лучший способ сделать это? регулярное выражение?

4b9b3361

Ответ 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!'

Ответ 2

AFAIK с использованием regex - плохая идея для синтаксического анализа HTML, вам было бы лучше  используя синтаксический анализатор HTML/XML, например красивый суп.

Ответ 3

Используйте lxml.html. Это намного быстрее, чем BeautifulSoup, а сырой текст - единственная команда.

>>> import lxml.html
>>> page = lxml.html.document_fromstring('<!DOCTYPE html>...</html>')
>>> page.cssselect('body')[0].text_content()
'...'

Ответ 4

Используйте 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 &gt; world</html>')
>>> ex.getvalue()
'hello > world'

Ответ 5

В зависимости от того, будет ли текст содержать ' > ' или '<' Я бы либо просто сделал функцию, чтобы удалить что-нибудь между ними, либо использовать разбор 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])