BeautifulSoupのparentsを使って親要素を取得する方法

こんにちは、今回はBeautifulSoupのparentsを使って親要素を取得する方法について解説します。

BeautifulSoupとは?

BeautifulSoupは、Pythonでよく使われるHTMLやXMLを解析するためのライブラリです。HTMLやXMLからデータを抽出する際によく使われます。

BeautifulSoupのparentsの基本的な使い方

BeautifulSoupのparentsは、指定したタグの親要素を取得するためのメソッドです。以下のように使用します。

from bs4 import BeautifulSoup
from bs4 import NavigableString
# HTMLをパースする
soup = BeautifulSoup(html, 'html.parser')
# 指定したタグの親要素を取得する
parent = soup.find('tag').parent

上記のコードでは、指定したタグの親要素をparentに格納しています。

具体的なコード例を用いたparentsの使い方の解説

以下のHTMLを例に、parentsの使い方を解説します。

<html>
  <head>
    <title>サイトタイトル</title>
  </head>
  <body>
    <div class="content">
      <h1>記事タイトル</h1>
      <p>記事本文</p>
    </div>
  </body>
</html>

上記のHTMLから、記事タイトルの親要素であるdivタグを取得するコードは以下のようになります。

from bs4 import BeautifulSoup
# HTMLをパースする
soup = BeautifulSoup(html, 'html.parser')
# 記事タイトルの親要素であるdivタグを取得する
div = soup.find('h1').parent
# divタグのclass属性を取得する
class_name = div.get('class')

上記のコードでは、h1タグの親要素であるdivタグを取得しています。その後、divタグのclass属性を取得しています。

parentsを用いた親要素の取得方法

parentsを用いた親要素の取得方法について解説します。

以下のHTMLを例に、pタグの親要素であるdivタグを取得するコードは以下のようになります。

<html>
  <head>
    <title>サイトタイトル</title>
  </head>
  <body>
    <div class="content">
      <h1>記事タイトル</h1>
      <p>記事本文</p>
    </div>
  </body>
</html>
from bs4 import BeautifulSoup
# HTMLをパースする
soup = BeautifulSoup(html, 'html.parser')
# pタグの親要素であるdivタグを取得する
div = soup.find('p').parent

上記のコードでは、pタグの親要素であるdivタグを取得しています。

parentsの使い方でよくあるエラーと対処法

parentsの使い方でよくあるエラーと対処法について解説します。

1. AttributeError: ‘NoneType’ object has no attribute ‘parent’

このエラーは、指定したタグが存在しない場合に発生します。以下のように、findメソッドで指定したタグが存在するかどうかを確認してください。

from bs4 import BeautifulSoup
# HTMLをパースする
soup = BeautifulSoup(html, 'html.parser')
# 指定したタグが存在するかどうかを確認する
if soup.find('tag') is not None:
    parent = soup.find('tag').parent
else:
    print('指定したタグは存在しません')

2. AttributeError: ‘NavigableString’ object has no attribute ‘parent’

このエラーは、NavigableStringオブジェクトに対してparentメソッドを呼び出した場合に発生します。以下のように、NavigableStringオブジェクトかどうかを確認してください。

from bs4 import BeautifulSoup
# HTMLをパースする
soup = BeautifulSoup(html, 'html.parser')
# NavigableStringオブジェクトかどうかを確認する
if isinstance(soup.find('tag').string, NavigableString):
    parent = soup.find('tag').parent
else:
    print('指定したタグはNavigableStringオブジェクトではありません')

parentsを使ったデータスクレイピングの具体例

以下のHTMLを例に、BeautifulSoupとparentsを使ってデータスクレイピングを行うコード例を紹介します。

<html>
  <head>
    <title>サイトタイトル</title>
  </head>
  <body>
    <div class="content">
      <h1>記事タイトル</h1>
      <p>記事本文</p>
    </div>
    <div class="related">
      <h2>関連記事</h2>
      <ul>
        <li><a href="link1">記事1</a></li>
        <li><a href="link2">記事2</a></li>
        <li><a href="link3">記事3</a></li>
      </ul>
    </div>
  </body>
</html>

上記のHTMLから、関連記事のリンクを取得するコードは以下のようになります。

from bs4 import BeautifulSoup
# HTMLをパースする
soup = BeautifulSoup(html, 'html.parser')
# 関連記事のリンクを取得する
links = []
related_div = soup.find('h2', text='関連記事').parent
for li in related_div.find('ul').find_all('li'):
    links.append(li.find('a').get('href'))

上記のコードでは、関連記事の親要素であるdivタグを取得しています。その後、ulタグとliタグを取得して、リンクを取得しています。

まとめ

BeautifulSoupのparentsを使うと、指定したタグの親要素を取得することができます。データスクレイピングなどで親要素を取得する必要がある場合は、ぜひ活用してみてください。