概要
Beautiful Soup で DOM ツリーに要素を追加したり、既存の要素を削除する方法を解説します。
関連記事
[blogcard url=”https://pystyle.info/scraping-beautiful-soup-how-to-find-elements”]
[blogcard url=”https://pystyle.info/scraping-beautiful-soup-how-to-refer-elements”]
機能一覧
メソッド | 概要 |
---|---|
append(要素) |
子要素の末尾に追加する |
extend(要素) |
子要素の末尾に複数追加する |
`insert(i, 要素) | I 番目の子要素の直前に追加する |
insert_before(要素) |
この要素の直前に追加する |
insert_after'(要素) |
この要素の直後に追加する |
clear() |
この要素の子孫を削除する |
extract() |
この要素を DOM ツリーから削除して返す |
decompose() |
この要素を DOM ツリーから削除する |
replace_with(要素) |
この要素を指定した要素で置き換える |
wrap(要素) |
この要素を指定した要素で囲む |
unwrap() |
この要素 (子孫は含まない) を DOM ツリーから削除する |
prettify() |
この要素を整形した HTML 文字列にして返す |
str(要素) |
この要素を HTML 文字列にして返す |
encode() |
この要素を UTF8 でエンコードされた HTML 文字列にして返す |
要素名を変更する
Tag.name
に文字列を代入することで、要素名を変更できます。
<html><body><blockquote class="boldest">Extremely bold</blockquote></body></html>
属性値を変更、追加、削除する
Tag[<AttributeName>]
に値を代入した場合、指定した属性が存在すれば属性値の変更、存在しない場合は新しく属性を追加することになります。また、属性は del
で削除できます。
<html><body><b class="verybold" id="1">Extremely bold</b></body></html> <html><body><b id="1">Extremely bold</b></body></html>
値を変更する
Tag.string
に文字列を代入することで、要素の値を変更できます。
<a href="http://example.com/">New link text.</a>
子を追加する
子要素の末尾に追加する
Tag.append(要素 or 文字列)
で子要素の末尾に文字列や要素を追加できます。
<html><body><a>FooBar</a></body></html> <html><body><b><a href="http://www.example.com"></a></b></body></html>
Tag.extend(要素 or 文字列)
で子要素の末尾に複数の文字列や要素を追加できます。
<html><body><a>BeautifulSoupGuide</a></body></html>
指定した子要素の直前に追加する
Tag.insert(n, 要素 or 文字列)
で n
番目の子要素の直前に文字列や要素を追加できます。
<html><body><a>BarFoo</a></body></html>
兄弟要素を追加する
指定した要素の直前に追加する
Tag.insert_before(要素 or 文字列)
でこの要素の直前に要素や文字列を追加できます。
<html><body><i></i><b>stop</b></body></html>
指定した要素の直後に追加する
Tag.insert_after(要素 or 文字列)
でこの要素の直後に要素や文字列を追加できます。
<html><body><b>stop</b><i></i></body></html>
削除する
子孫ノードを削除する
Tag.clear()
でこの要素のすべての子孫要素を削除できます。
<a href="http://example.com/">I linked to <i>example.com</i></a> <a href="http://example.com/"></a>
この要素を DOM ツリーから削除して返す
Tag.extract()
でこの要素を DOM ツリーから削除して返します。
<i>example.com</i> <html><body><a href="http://example.com/">I linked to </a></body></html>
この要素を DOM ツリーから削除する
Tag.decompose()
でこの要素を DOM ツリーから削除します。
<html><body><a href="http://example.com/">I linked to </a></body></html>
この要素のみを DOM ツリーから削除する
Tag.extract()
や Tag.decompose()
との違い、Tag.unwrap()
はこの要素のみを削除し、その子孫要素はそのまま残します。
<html><body><a href="http://example.com/">I linked to example.com</a></body></html>
要素を置換する
Tag.replace_with(要素 or 文字列)
でこの要素を指定した要素や文字列で置換します。
<html><body><a href="http://example.com/">I linked to <b>example.net</b></a></body></html>
指定した要素で囲む
Tag.wrap(要素)
でこの要素を指定した要素で囲みます。
<b>I wish I was bold.</b> <html><body><p><b>I wish I was bold.</b></p></body></html>
DOM ツリーを HTML で出力する
整形した HTML で出力する
Tag.prettify()
で指定した要素以下を整形された HTML 文字列に変換して返します。
formatter="html"
を指定した場合、Unicode 文字は HTML エンティティに変換します。
<html> <body> <p> Il a dit <<Sacré bleu!>> </p> </body> </html> <html> <body> <p> Il a dit <<Sacré bleu!>> </p> </body> </html>
formatter="html5"
を指定した場合、空要素 br
は /
を付けないで変換します。
<html> <body> <br/> </body> </html> <html> <body> <br> </body> </html>
formatter=None
を指定した場合、なにも修正せずにそのまま変換します。
<html> <body> <br/> </body> </html>
整形せずに HTML で出力する
str(Tag)
で指定した要素以下を HTML 文字列に変換できます。また、Tag.encode()
で UTF8 でエンコードしたバイト列に変換できます。
<html><body><p>Il a dit <<Sacré bleu!>></p></body></html> b'<html><body><p>Il a dit <<Sacr\xc3\xa9 bleu!>></p></body></html>'
連続する NavigableString
を1つに統合する
DOM ツリーを編集して、連続した NavigableString
ができてしまった場合に、Tag.smooth()
を呼び出すことで1つに統合できます。
root (BeautifulSoup) └── html (Tag) └── body (Tag) └── a (Tag) ├── 'Foo' (NavigableString) ├── 'Hoge' (NavigableString) └── 'Fuga' (NavigableString)
root (BeautifulSoup) └── html (Tag) └── body (Tag) └── a (Tag) └── 'FooHogeFuga' (NavigableString)
コメント