私はこのようなテキストを持っています:
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を呼び出すときにパーサーを明示的に設定する必要があります。別の回答で説明したように「lxml」をお勧めします(デフォルトのものよりもはるかに堅牢です(追加インストールなしで利用可能) 'html.parser'
from bs4 import BeautifulSoup
cleantext = BeautifulSoup(raw_html, "lxml").text
ただし、外部ライブラリの使用を妨げるものではないため、最初のソリューションをお勧めします。
PythonにはいくつかのXMLモジュールが組み込まれています。完全なHTMLを含む文字列を既に持っている場合の最も単純なモジュールは xml.etree
で、これは(言及した)lxmlの例と同様に機能します。
def remove_tags(text):
return ''.join(xml.etree.ElementTree.fromstring(text).itertext())
これは完璧ではないことに注意してください。たとえば、<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())
これは、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 。それは無料です!