2012-01-14 8 views
2

私はBeautifulSoupを使用して、任意のテキストセットからすべてのHTMLタグ(aのような事前承認タグのセットを除く)をエスケープします。しかし、実際の有効なHTMLタグであればタグをエスケープしたいだけです。何かがタグのように見えますが、そうでない場合は、HTMLを追加して閉じてしまいます。私は望みません。BeautifulSoupがタグのように見えるが、そうではない自己閉鎖のものを防ぐ方法を教えてください。

例:誰かがテキスト<integer>に入った場合は、私のコードは&lt;integer&gt;&lt;/integer&gt;だけではなく&lt;integer&gt;

を吐き終わるここのコードです(valueは、HTML文字列であるとVALID_TAGSが許容できるタグ名のリストだけです)。

soup = BeautifulSoup.BeautifulSoup(
    value, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES) 
# Loop through all the tags. If it is invalid, escape the characters. 
for tag in soup.findAll(): 
    if tag.name not in VALID_TAGS: 
    tag.replaceWith(cgi.escape(str(tag))) 
return soup.renderContents() 

ありがとうございます。

+3

私の意見はあなたが仕事に間違ったツールを使用しているということです。 –

+0

少なくとも、属性をフィルタリングする必要があります。 'Look at this!' http://html5sec.orgを見てください。 –

+0

私も属性をフィルタリングしています(ホワイトリストの場合を除いて)。私はサンプルコードから削除し、明確にするために質問します。 – Chad

答えて

1

this answerに基づくhtml5libを出発点としてこれを考え出しました。助けたすべての人に

p = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer, tree=treebuilders.getTreeBuilder("dom")) 
dom_tree = p.parseFragment(value) 
walker = treewalkers.getTreeWalker("dom") 
stream = walker(dom_tree) 
s = serializer.htmlserializer.HTMLSerializer(quote_attr_values=True) 
return s.render(stream) 

ありがとう:ここではそれは私が説明<integer>場合を適切に作品を除いて、上記で開始BeautifulSoupコードと同じことをして、私が終わったかのバージョンがあります。

0

あなたは間違っています(tm)。 BeatifulSoupはそのように使用するつもりはありません。 これを代わりに見てみましょう:http://code.activestate.com/recipes/52281-strip-tags-and-javascript-from-html-page-leaving-o/ このレシピは無効なタグを削除し、それらを保持したいがエスケープしたように聞こえます。かなり簡単に修正する必要があります。

+0

ここでの問題は、レシピでsgmllibが使用されていることです。これは2.6以降で廃止されました。 – Chad

+1

OK、ここで説明するようにHTMLパーサーを使用してください。http://unethicalblogger.com/2008/05/03/parsing-html-with-python.html –

+0

コード化されていて、ほとんどの場合有効ですが、無効な入力'<スクリプト ' – Chad

関連する問題