15

BeautifulSoup を使用して HTML のクリーニングを行っています。Python と BeautifulSoup の両方に精通しています。Stackoverflow の他の場所で見つけた回答に基づいて、次のようにタグが正しく削除されています。

[s.extract() for s in soup('script')]

しかし、インライン スタイルを削除するにはどうすればよいでしょうか。たとえば、次のようにします。

<p class="author" id="author_id" name="author_name" style="color:red;">Text</p>
<img class="some_image" href="somewhere.com">

次のようになる必要があります。

<p>Text</p>
<img href="somewhere.com">

すべての要素のインライン クラス、id、名前、およびスタイル属性を削除する方法は?

BeautifulSoup ではなく、CSS パーサーを使用してこれを処理することについて言及されている他の同様の質問への回答をすべて見つけることができましたが、タスクは属性を操作するのではなく単に削除することであり、すべてのタグの包括的なルールであるため、見つけたいと思っていましたBeautifulSoup 内ですべてを行う方法です。

4

6 に答える 6

31

すべてを削除したいだけの場合は、CSS を解析する必要はありません。BeautifulSoup は、次のように属性全体を削除する方法を提供します。

for tag in soup():
    for attribute in ["class", "id", "name", "style"]:
        del tag[attribute]

extract()また、タグ全体 (およびその内容) を削除するだけの場合は、タグを返す は必要ありません。あなただけが必要ですdecompose()

[tag.decompose() for tag in soup("script")]

大きな違いはありませんが、ドキュメントを見ているときに見つけたものです。API の詳細については、BeautifulSoup のドキュメントを参照してください。多くの例が含まれています。

于 2012-10-18T16:41:09.070 に答える
11

私はこれをしませんBeautifulSoup- エッジケースの試行、テスト、および回避に多くの時間を費やすことになります。

Bleachまさにこれを行います。 http://pypi.python.org/pypi/bleach

でこれを行う場合はBeautifulSoup、「ホワイトリスト」アプローチを使用することをお勧めしますBleach。どのタグがどの属性を持つかを決定し、一致しないすべてのタグ/属性を取り除きます。

于 2012-10-18T16:47:10.200 に答える
1

jmk の関数に基づいて、この関数を使用して、ホワイト リストに基づいて属性を削除します。

python2、BeautifulSoup3での作業

def clean(tag,whitelist=[]):
    tag.attrs = None
    for e in tag.findAll(True):
        for attribute in e.attrs:
            if attribute[0] not in whitelist:
                del e[attribute[0]]
        #e.attrs = None     #delte all attributes
    return tag

#example to keep only title and href
clean(soup,["title","href"])
于 2013-07-26T21:33:24.283 に答える