アイキャッチ画像

PythonのBeautifulSoup4でHTMLの要素を新しい要素で囲う

PythonのBeautifulSoup4モジュールを使って、HTMLドキュメントの要素を別の要素で囲ってみました。

目次

  1. 要素に親要素を追加する方法
  2. wrapメソッドの使用例

要素に親要素を追加する方法

Beautiful Soup 4のwrapメソッドで親要素を追加します。

ret = soup.wrap(soup.new_tag(name, [attr]))
変数 内容
ret 囲った部分のタグ要素。
soup HTMLドキュメントのオブジェクト。
name 囲う要素の名前。
attr 省略可。囲う要素の属性

囲うからラップですね。引数にはbs4.element.Tagクラスのオブジェクトを指定します。

wrapメソッドの使用例

こういうindex.htmlがあるとします。

<html>
    <head></head>
    <body>
        <h1 class="1st">最初の章</h1>
            <ul>
                <li id="foo">項目1</li>
                <li id="bar">項目2</li>
                <li id="bar">項目3</li>
            </ul>
        <h1 class="2nd">2つめの章</h1>
            <p>文章</p>
    </body>
</html>

このHTMLドキュメントのUL要素をDIV要素で囲ってみます。

>>> from bs4 import BeautifulSoup
>>> with open('index.html', mode='rt', encoding='utf-8') as f:
...     soup = BeautifulSoup(f.read(), 'html.parser')
...

>>> wrapped_tag = soup.find('ul').wrap(soup.new_tag('div', class_='hoge'))

>>> wrapped_tag # 囲った結果の表示
<div class_="hoge"><ul>
<li id="foo">項目1</li>
<li id="bar">項目2</li>
<li id="bar">項目3</li>
</ul></div>

>>> soup # HTMLドキュメント全体の表示
<html>
<head></head>
<body>
<h1 class="1st">最初の章</h1>
<div class_="hoge"><ul>
<li id="foo">項目1</li>
<li id="bar">項目2</li>
<li id="bar">項目3</li>
</ul></div>
<h1 class="2nd">2つめの章</h1>
<p>文章</p>
</body>
</html>

UL要素がdiv要素で囲われました。

囲われたのですが、属性が変です。classにしたいところがclass_になっていしまいました。

class='hoge'とアンダーバー無しで指定すると、実行時にシンタックスエラーになってしまいます。

これはちょっと困りますねえ。

広告

PythonとXMLカテゴリの投稿