こんにちは、今回は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を使うと、指定したタグの親要素を取得することができます。データスクレイピングなどで親要素を取得する必要がある場合は、ぜひ活用してみてください。





