beautifulsoupのドキュメントの真ん中辺りに書かれている便利な関数

スクレイピングで目的の要素にアプローチする方法は色々あると思う。

1. find系のメソッドでアプローチ
2. CSSセレクタでアプローチ
3. 正規表現でアプローチ


今日は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>  

1. next_sibling

指定の要素の次にあり、かつ同一階層にある要素を一つだけ返す。

print(sibling_soup.a.next_sibling) ## <b>高安</b>  
print(sibling_soup.b.next_sibling) ## <c>豪栄道</c>  
print(sibling_soup.c.next_sibling) ## None  

2. next_siblings

指定の要素より後ろにあり、かつ同一階層にある要素をもつジェネレータを返す。

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>  

3. previous_sibling

指定の要素の前にあり、かつ同一階層にある要素を一つだけ返す。

print(sibling_soup.a.previous_sibling) ## None  
print(sibling_soup.b.previous_sibling) ## <a>稀勢の里</a>  
print(sibling_soup.c.previous_sibling) ## <b>高安</b>  

4. previous_siblings

指定の要素より前にあり、かつ同一階層にある要素をもつジェネレータを返す。

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>  

これならクラス名を変えられても、何とか目的の要素をスクレイプできそう。