web-dev-qa-db-ja.com

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()を使用してそれを行うことができることを知っていますが、2.6以上の組み込みまたはstdライブラリを使用して純粋なPythonで同じことを達成する必要があります

どうやってやるの?

正規表現を使用する

正規表現を使用すると、<>内のすべてをクリーンアップできます。

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