スクレイピングで目的の要素にアプローチする方法は色々あると思う。
今日は1のアプローチからBeautifulSoupのsibling系のメソッドをご紹介する。
siblingとは英語で兄弟姉妹の意味。
その名の通り、指定のタグの隣にあるタグを返す。
sibling系には次の4つのメソッドがある。
(ここからは以下のようなタグを例にする。)
sibling_soup = BeautifulSoup("<div><a>稀勢の里</a><b>高安</b></b><c>豪栄道</c></div>", "lxml")
print(sibling_soup.prettify())
#<html>
# <body>
# <div>
# <a>
# 稀勢の里
# </a>
# <b>
# 高安
# </b>
# <c>
# 豪栄道
# </c>
# </div>
# </body>
#</html>
指定の要素の次にあり、かつ同一階層にある要素を一つだけ返す。
print(sibling_soup.a.next_sibling) ## <b>高安</b>
print(sibling_soup.b.next_sibling) ## <c>豪栄道</c>
print(sibling_soup.c.next_sibling) ## None
指定の要素より後ろにあり、かつ同一階層にある要素をもつジェネレータを返す。
print(sibling_soup.a.next_siblings)
## <generator object next_siblings at 0x7f533daf20f8>
for tag in sibling_soup.a.next_siblings:
print(tag)
## <b>高安</b>
## <c>豪栄道</c>
指定の要素の前にあり、かつ同一階層にある要素を一つだけ返す。
print(sibling_soup.a.previous_sibling) ## None
print(sibling_soup.b.previous_sibling) ## <a>稀勢の里</a>
print(sibling_soup.c.previous_sibling) ## <b>高安</b>
指定の要素より前にあり、かつ同一階層にある要素をもつジェネレータを返す。
print(sibling_soup.c.previous_siblings)
## <generator object previous_siblings at 0x7f533daf20f8>
for tag in sibling_soup.c.previous_siblings:
print(tag)
## <b>高安</b>
## <a>稀勢の里</a>
これならクラス名を変えられても、何とか目的の要素をスクレイプできそう。