web-dev-qa-db-ja.com

pythonとlxmlモジュールを使用して、htmlからすべてのjavascriptタグとスタイルタグを削除します

http://lxml.de/ ライブラリを使用してhtmlドキュメントを解析しています。これまでのところ、htmlドキュメントからタグを削除する方法を理解しました lxmlで、タグを削除してすべてのコンテンツを保持するにはどうすればよいですか? しかし、その投稿で説明されている方法では、すべてのテキストが残り、タグが削除されます実際のスクリプトを削除せずに。 lxml.html.clean.Cleanerへのクラス参照も見つけました http://lxml.de/api/lxml.html.clean.Cleaner-class.html しかし、これは泥のように明らかですクラスを実際に使用してドキュメントをクリーンアップする方法について説明します。どんな助けでも、おそらく短い例が私に役立つでしょう!

27
john-charles

以下はあなたがやりたいことをするための例です。 HTMLドキュメントの場合、Cleanerは、_strip_elements_を使用するよりも、問題に対するより一般的な解決策です。このような場合、_<script>_タグ以外のものを削除する必要があるためです。また、他のタグのonclick=function()属性などを削除する必要があります。

_#!/usr/bin/env python

import lxml
from lxml.html.clean import Cleaner

cleaner = Cleaner()
cleaner.javascript = True # This is True because we want to activate the javascript filter
cleaner.style = True      # This is True because we want to activate the styles & stylesheet filter

print("WITH JAVASCRIPT & STYLES")
print(lxml.html.tostring(lxml.html.parse('http://www.google.com')))
print("WITHOUT JAVASCRIPT & STYLES")
print(lxml.html.tostring(cleaner.clean_html(lxml.html.parse('http://www.google.com'))))
_

lxml.html.clean.Cleanerドキュメント ;で設定できるオプションのリストを取得できます。 TrueまたはFalse(デフォルト)に設定できるオプションもあれば、次のようなリストを使用するオプションもあります。

_cleaner.kill_tags = ['a', 'h1']
cleaner.remove_tags = ['p']
_

Killとremoveの違いに注意してください。

_remove_tags:
  A list of tags to remove. Only the tags will be removed, their content will get pulled up into the parent tag.
kill_tags:
  A list of tags to kill. Killing also removes the tag's content, i.e. the whole subtree, not just the tag itself.
allow_tags:
  A list of tags to include (default include all).
_
56
aculich

strip_elements メソッドを使用してスクリプトを削除してから、 strip_tags メソッドを使用して他のタグを削除できます。

etree.strip_elements(fragment, 'script')
etree.strip_tags(fragment, 'a', 'p') # and other tags that you want to remove
4
cenanozen

この目的にもbs4librayを使用できます。

soup = BeautifulSoup(html_src, "lxml")
[x.extract() for x in soup.findAll(['script', 'style'])]
2
Shafiq