ユーニックス総合研究所

  • home
  • archives
  • bs4-del

BeautifulSoup4の削除系のメソッドを3つ紹介

  • 作成日: 2021-01-03
  • 更新日: 2023-12-24
  • カテゴリ: BeautifulSoup4

BeautifulSoup4の削除系メソッド3つ

Pythonの外部ライブラリにBeautifulSoup4(ビューティフル・スープ・フォー)があります。
これはHTML/XMLをパースするライブラリです。PythonによるWebページのスクレイピングで使われることがあるライブラリで、大変人気があります。

今回はこのBeautifulSoup4の削除系メソッドを3つ紹介します。
その3つとは↓になります。

  • clear()
  • extract()
  • decompose()

削除系のメソッドはBeautifulSoup4で取得したタグを再構成したり編集したりするときに使われます。
これとあわせて追加系のメソッドも押さえておけばタグを自由に編集できるようになります。

clearメソッド

clear()メソッドはbs4.element.Tagのメソッドです。
これはタグの内容を削除するメソッドです。

clear()メソッドは↓のように使います。

from bs4 import BeautifulSoup  

html = '''  
<div>  
    <p>Soup</p>  
</div>  
'''  

soup = BeautifulSoup(html, 'html.parser')  
result = soup.div.clear()  

print('---- result ----')  
print(result)  

print('---- soup ----')  
print(soup)  

↑のコードの出力は↓になります。

---- result ----  
None  
---- soup ----  

<div></div>  

↑の出力を見ると、clear()メソッドの返り値はNoneであることがわかります。
また<div>タグの中身である<p>Soup</p>タグとテキストが削除されているのがわかります。
つまりclear()メソッドは容赦ない削除をするメソッドです。

extractメソッド

extract()メソッドはbs4.element.Tagのメソッドです。
extract()メソッドは要素をツリーから削除し、削除した要素を返り値として返すメソッドです。
extract()メソッドは↓のようにつかいます。

from bs4 import BeautifulSoup  

html = '''  
<div>  
    <p>Soup</p>  
</div>  
'''  

soup = BeautifulSoup(html, 'html.parser')  
result = soup.div.p.extract()  

print('---- result ----')  
print(result)  

print('---- soup ----')  
print(soup)  

↑のコードの出力結果は↓になります。

---- result ----  
<p>Soup</p>  
---- soup ----  

<div>  

</div>  

↑の出力を見るとextract()の返り値に削除した要素(<p>Soup</p>)が返ってきてるのがわかります。
ツリー(soup)を見ると要素がツリーからさ削除されているのがわかります。

extract()メソッドは↑のように削除した要素を保持しておくことが出来ます。
そのためアンドゥが効くメソッドと言えます。

decomposeメソッド

decompose()メソッドはbs4.element.Tagのメソッドです。
decompose()メソッドは指定した要素を完全に削除し破壊するメソッドです。
decompose()メソッドは↓のように使います。

from bs4 import BeautifulSoup  

html = '''  
<div>  
    <p>Soup</p>  
</div>  
'''  

soup = BeautifulSoup(html, 'html.parser')  
result = soup.div.p.decompose()  

print('---- result ----')  
print(result)  

print('---- soup ----')  
print(soup)  

↑のコードの出力は↓になります。

--- result ----  
None  
--- soup ----  

<div>  

</div>  

↑の出力のようにdecompose()メソッドは返り値を返さず、要素を完全に削除します。

clear()とdecompose()の違い

clear()decompose()の違いはなんでしょうか?
clear()は要素を完全に破壊しないのに対して、decompose()は要素を完全に破壊する点が違っています。
これはどういうことかと言うと、最初にclear()メソッドの挙動を見てみます。

from bs4 import BeautifulSoup  

html = '''  
<div>  
    <p>Soup</p>  
</div>  
'''  

soup = BeautifulSoup(html, 'html.parser')  
p = soup.div.p  # ここでpを保存  
soup.div.clear()  # pを含む要素をクリア  

print('---- soup ----')  
print(soup)  

print('---- p ----')  
print(p)  # pは生きてる?  

↑のコードの出力は↓のようになります。

---- soup ----  

<div></div>  

---- p ----  
<p>Soup</p>  

↑のように最初に<p>タグの要素を変数に保存してます。
そのあとに<div>要素以下のコンテンツをclear()で削除しています。
その後<p>タグを保存した変数を出力すると、↑のように<p>タグが出力されます。
これはclear()メソッドでは<p>タグが完全に破壊されず生き残っているということになります。

🦝 < clear()は要素を完全に破壊しないんだな

🐭 < アンドゥ可能なんだね

🦊 < きみ「容赦ない削除」って言ってたやん

いっぽう、decompose()メソッドの挙動を見てみましょう。

from bs4 import BeautifulSoup  

html = '''  
<div>  
    <p>Soup</p>  
</div>  
'''  

soup = BeautifulSoup(html, 'html.parser')  
p = soup.div.p  # ここでpを保存  
soup.div.p.decompose()  # pをdecompose  

print('---- soup ----')  
print(soup)  

print('---- p ----')  
print(p)  # pは生きてる?  

↑のコードの出力は↓になります。

---- soup ----  

<div>  

</div>  

---- p ----  
<None></None>  

↑の出力を見ると、変数に保存した<p>タグが<None>になっているのがわかります。

🦝 < pタグがしんじゃった!

はい。このようにdecompose()は要素を完全に破壊します。
decompose(), 恐ろしい子。

おわりに

今回はBeautifulSoup4の削除系メソッドを3つ紹介しました。
各メソッドをまとめると↓のようになります。

  • clear() ... アンドゥ可能な削除
  • extract() ... アンドゥ可能な削除。要素を取り出せる
  • decompose() ... アンドゥ不可能な削除。要素を完全に破壊

これらの削除系メソッドの特性を上手く使うことでスクレイピングなどの処理がもっと楽になるかと思います。
今回は以上です。

🦝 < かたっぱしから削除しよう