2012-05-07 9 views
7

文字列からHTMLタグを削除する方法についてはいくつかの質問がありましたが、私の具体的なケースをどう扱うべきかについてはまだ不明です。文字列からhtml画像タグとその間のすべてを削除する

多くの記事で正規表現を使用してHTMLを処理することは推奨されていますが、私の場合はこのルールの賢明な迂回を正当化すると思われます。

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

私のアプリの別の部分で、私はこれらのイメージタグを取り除く必要があります。私たちはしかイメージタグを扱っていないので、私は正規表現の使用が正当であると思われます。

私の質問は2つあり:

  1. が、私はこれらのタグを削除するために正規表現を使用すべきか、私はまだ、このようなBeautifulSoupとしてHTMLの構文解析モジュールを使用する必要がありますか?
  2. どの正規表現またはBeautifulSoup構造を使用する必要がありますか?言い換えれば、これをどのようにコード化すべきですか?明確にするために

、タグが<img src="/path/to/file"/>

感謝として構成されています!

+0

このファイルには他にHTMLがありますか?それとも、文字通りプレーンテキストと「」タグだけですか? – senderle

+0

@senderleいいえ、タグのほかにHTMLはありません。したがって、本格的なHTML libを使用することに躊躇します。形式は*常に*私がそれをどのように記述するかです。 – blz

+0

私はちょうど答えを掲示しましたが、すべてのイメージの終わりの後に実際にアポストロフィがあるのか​​、それともタイプミスですか? – joshcartme

答えて

8

あなたのケースでは、正規表現を使用することは容認できます。このような何か作業をする必要があります:

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) 
+0

私はそのページも以前に見ましたが、問題の正規表現について少し混乱しています。つかいます)。 '。*? '文字列はなぜですか?それは ''のようなものではありませんか? – blz

+1

私が最初に投稿した方法は、< and >の間で何かを削除することでした。平文に他のインスタンス(< or >)がある場合(htmlタグではありません)、持ってはいけないものが削除されています。私はもう少し選択的な別のバージョンを掲載しました。 – joshcartme

+0

クール!どうもありがとうございます! – blz

3

このテキストはのみイメージタグを含んでいるので、それは正規表現を使用するために、おそらくOKです。しかし、他の何かのために、あなたはおそらくbonafide 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 
+1

華麗な、ありがとう!私は正規表現のルートを行くつもりだと思います。なぜなら、コードが少なくて済むように思えるからです(シンプル化、簡素化!)。 – blz

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) 
関連する問題