BeautifulSoup4の要素の追加・削除・置換の使い方

2019年12月15日

BeautifulSoup4 でBeautiful Soupオブジェクトの要素に対して追加、削除、置換を行う方法を解説します

以下の記事でタグオブジェクトについての説明などを行っていますので、良ければご確認ください

リンク:BeautifulSoup4のタグオブジェクトの使い方

追加

タグの要素に対してタグや文字列の追加を行う方法を以下に記述します

append()

append()メソッドはタグオブジェクトに対して文字列を追加するときに使用します

soup = BeautifulSoup("<p></p>", 'html.parser')
soup.p.append('Soup')
print(soup)
----結果----
<p>Soup</p>

new_string()

new_string()メソッドはappend()メソッドと似ています
違いとしてnew_string()メソッドはNavigable Stringオブジェクトを生成することができ、コメントの追加などに使用することができます

from bs4 import Comment
soup = BeautifulSoup("<p></p>", 'html.parser')
new_string = soup.new_string('Comment', Comment)
soup.append(new_string)
print(soup)
----結果----
<p></p><!--Comment-->

new_tag()

new_tag()メソッドは新しくタグを追加するときに使用します

第一引数にはタグ名が必須です

soup = BeautifulSoup("<p></p>", 'html.parser')
new_tag = soup.new_tag('a', href='https://senablog.com/')
soup.p.append(new_tag)
print(soup)
----結果----
<p><a href="https://senablog.com/"></a></p>

insert()

insert()メソッドはappend()メソッドに似ています
insert()は追加位置を指定して要素を追加できます

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
soup.p.insert(0, 'Soup ')
print(soup)
----結果----
<p>Soup Beautiful</p>

insert_before()

insert_before()メソッドは、特定のタグの前にタグや文字列を追加します

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
new_tag = soup.new_tag('b')
new_tag.string = 'Soup'
soup.p.string.insert_before(new_tag)
print(soup)
----結果----
<p><b>Soup</b>Beautiful</p>

insert_after()

insert_after()メソッドはinsert_before()メソッドの逆で、特定のタグの後にタグや文字列を追加します

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
new_tag = soup.new_tag('b')
new_tag.string = 'Soup'
soup.p.string.insert_after(new_tag)
print(soup)
----結果----
<p>Beautiful<b>Soup</b></p>

削除

削除を行う方法は三つあります
それぞれ使い方が違うので状況に応じて使い分けましょう

clear()

clear()メソッドを使用するとタグの間にある文字列を削除することができます

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
soup.p.clear()
print(soup)
----結果----
<p></p>

extract()

extract()メソッドはタグとその文字列を削除することができます
そのときに削除した要素は返却されます

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
new_tag = soup.new_tag('b')
new_tag.insert(0, 'Soup')
soup.append(new_tag)
print(soup)
ex_soup = soup.p.extract()
print(ex_soup)
print(soup)
----結果----
<p>Beautiful</p><b>Soup</b>
<p>Beautiful</p>
<b>Soup</b>

decompose()

decompose()メソッドはタグの間にある文字列とタグの全てを削除します
extract()と違い完全に削除されるので、返却値などはNoneとなります

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
new_tag = soup.new_tag('b')
new_tag.insert(0, 'Soup')
soup.append(new_tag)
print(soup)
dec_soup = soup.p.decompose()
print(dec_soup)
print(soup)
----結果----
<p>Beautiful</p><b>Soup</b>
None
<b>Soup</b>

置換

置換を行うときに最も使いやすいのがreplace_with()メソッドです
基本はreplace_with()メソッドを使い、状況に応じてほか二つのメソッドを使用するとよいです

replace_with()

replace_with()メソッドは特定のタグとその文字列を削除して、新しいタグや文字列に置換させます

soup = BeautifulSoup("<p>Beautiful<b>Soup</b></p>", 'html.parser')
ex_soup=soup.b.extract()
print(soup)
soup.p.replace_with(ex_soup)
print(soup)
----結果----
<p>Beautiful</p>
<b>Soup</b>

extract()と併用したりすると便利だったりします

wrap()

wrap()メソッドは特定のタグの周りを、指定したタグオブジェクトに置換します
引数はタグオブジェクトでないと使用できないので、「wrap(‘b’)」とするとエラーになります

soup = BeautifulSoup("<p>Beautiful</p>", 'html.parser')
soup.p.wrap(soup.new_tag('b'))
print(soup)
----結果---
<b><p>Beautiful</p></b>

unwrap()

unwrap()メソッドは指定したタグを指定したタグの要素に置換します

soup = BeautifulSoup("<div><p>Beautiful</p><b>Soup</b></div>", 'html.parser')
soup.div.unwrap()
print(soup)
----結果----
<p>Beautiful</p><b>Soup</b>