9

文字列からHTMLタグを削除することについて多くの質問を見てきましたが、特定のケースをどのように処理する必要があるかについてはまだ少しわかりません。

多くの投稿がHTMLの処理に正規表現を使用しないようにアドバイスしているのを見てきましたが、私の場合はこのルールを慎重に回避する必要があるのではないかと思います。

PDFファイルを解析しようとしていますが、サンプルPDFファイルの各ページをUTF-32テキストの文字列に正常に変換できました。画像が表示されると、画像の名前と場所(他の場所に保存されている)を含むHTMLスタイルのタグが挿入されます。

アプリの別の部分で、これらの画像タグを削除する必要があります。画像タグのみを扱っているので、正規表現の使用が正当化されるのではないかと思います。

私の質問は2つあります:

  1. これらのタグを削除するために正規表現を使用する必要がありますか、それともBeautifulSoupなどのHTML解析モジュールを使用する必要がありますか?
  2. どの正規表現またはBeautifulSoupコンストラクトを使用する必要がありますか?言い換えれば、これをどのようにコーディングすればよいですか?

わかりやすくするために、タグは次のように構成されています。<img src="/path/to/file"/>

ありがとう!

4

3 に答える 3

15

あなたの場合、正規表現を使用することは許容できると私は投票します。このようなものが機能するはずです:

def remove_html_tags(data):
    p = re.compile(r'<.*?>')
    return p.sub('', data)

ここでそのスニペットを見つけました(http://love-python.blogspot.com/2008/07/strip-html-tags-using-python.html)

編集:フォームのものだけを削除するバージョン<img .... />

def remove_img_tags(data):
    p = re.compile(r'<img.*?/>')
    return p.sub('', data)
于 2012-05-07T17:20:15.773 に答える
3

このテキストには画像タグのみが含まれているため、正規表現を使用しても問題ありません。しかし、それ以外の場合は、正真正銘のHTMLパーサーを使用したほうがよいでしょう。幸いなことに、Pythonは1つを提供します!これはかなり必要最低限​​のものです。完全に機能させるには、さらに多くのコーナーケースを処理する必要があります。(特に、XHTMLスタイルの空のタグ(スラッシュで終わる<... />)はここでは正しく処理されません。)

>>> from HTMLParser import HTMLParser
>>> 
>>> class TagDropper(HTMLParser):
...     def __init__(self, tags_to_drop, *args, **kwargs):
...         HTMLParser.__init__(self, *args, **kwargs)
...     self._text = []
...         self._tags_to_drop = set(tags_to_drop)
...     def clear_text(self):
...         self._text = []
...     def get_text(self):
...         return ''.join(self._text)
...     def handle_starttag(self, tag, attrs):
...         if tag not in self._tags_to_drop:
...             self._text.append(self.get_starttag_text())
...     def handle_endtag(self, tag):
...         self._text.append('</{0}>'.format(tag))
...     def handle_data(self, data):
...         self._text.append(data)
... 
>>> td = TagDropper([])
>>> td.feed('A line of text\nA line of text with an <img url="foo"> tag\nAnother line of text with a <br> tag\n')
>>> print td.get_text()
A line of text
A line of text with an <img url="foo"> tag
Another line of text with a <br> tag

そしてタグをドロップするにはimg...

>>> td = TagDropper(['img'])
>>> td.feed('A line of text\nA line of text with an <img url="foo"> tag\nAnother line of text with a <br> tag\n')
>>> print td.get_text()
A line of text
A line of text with an  tag
Another line of text with a <br> tag
于 2012-05-07T17:53:59.063 に答える
0

私の解決策は次のとおりです。

def remove_HTML_tag(tag, string):
    string = re.sub(r"<\b(" + tag + r")\b[^>]*>", r"", string)
    return re.sub(r"<\/\b(" + tag + r")\b[^>]*>", r"", string)
于 2018-03-02T09:55:10.350 に答える