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>
これならクラス名を変えられても、何とか目的の要素をスクレイプできそう。