it-swarm.com.ru

Python код для удаления тегов HTML из строки

У меня есть такой текст:

text = """<div>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</div>"""

используя чистый Python, без внешнего модуля я хочу иметь это:

>>> print remove_tags(text)
Title A long text..... a link

Я знаю, что могу сделать это, используя lxml.html.fromstring (text) .text_content (), но мне нужно добиться того же в чистом Python, используя встроенную или стандартную библиотеку для 2.6+

Как я могу это сделать?

98
Bruno Rocha - rochacbruno

Используя регулярное выражение

Используя регулярные выражения, вы можете очистить все внутри <>:

import re

def cleanhtml(raw_html):
  cleanr = re.compile('<.*?>')
  cleantext = re.sub(cleanr, '', raw_html)
  return cleantext

Использование BeautifulSoup

Вы также можете использовать дополнительный пакет BeautifulSoup, чтобы узнать весь необработанный текст

При вызове BeautifulSoup вам нужно будет явно установить синтаксический анализатор. Я рекомендую "lxml", как указано в альтернативных ответах (гораздо более надежный, чем стандартный (то есть доступный без дополнительной установки) "html.parser"

from bs4 import BeautifulSoup
cleantext = BeautifulSoup(raw_html, "lxml").text

Но это не мешает вам использовать внешние библиотеки, поэтому я рекомендую первое решение.

178
c24b

Python имеет несколько встроенных XML-модулей. Самый простой для случая, когда у вас уже есть строка с полным HTML-кодом, --- xml.etree , который работает (в некоторой степени) аналогично примеру lxml, который вы упомянули:

def remove_tags(text):
    return ''.join(xml.etree.ElementTree.fromstring(text).itertext())
33
lvc

Обратите внимание, что это не идеально, так как если бы у вас было что-то вроде, скажем, <a title=">">, оно сломалось бы. Тем не менее, речь идет о ближайшем к небиблиотеке Python без действительно сложной функции:

import re

TAG_RE = re.compile(r'<[^>]+>')

def remove_tags(text):
    return TAG_RE.sub('', text)

Однако, как упоминает lvc, xml.etree доступен в стандартной библиотеке Python, так что вы, вероятно, можете просто настроить ее так, чтобы она соответствовала существующей версии lxml:

def remove_tags(text):
    return ''.join(xml.etree.ElementTree.fromstring(text).itertext())
27
Amber

Есть простой способ сделать это на любом C-подобном языке. Стиль не Pythonic, но работает с чистым Python:

def remove_html_markup(s):
    tag = False
    quote = False
    out = ""

    for c in s:
            if c == '<' and not quote:
                tag = True
            Elif c == '>' and not quote:
                tag = False
            Elif (c == '"' or c == "'") and tag:
                quote = not quote
            Elif not tag:
                out = out + c

    return out

Идея основана на простой машине конечных состояний и подробно объяснена здесь: http://youtu.be/2tu9LTDujbw

Вы можете увидеть, как это работает здесь: http://youtu.be/HPkNPcYed9M?t=35s

PS - Если вы заинтересованы в классе (об умной отладке с python), я дам вам ссылку: http://www.udacity.com/overview/Course/cs259/CourseRev/1 . Это бесплатно!

5
Medeiros