見出し画像

再帰関数でTagオブジェクトの全タグをチェックする

今日は、『つくってマスターPython』の第5章で学んだことをアウトプットします。

Tagオブジェクトのchildrenは直下のタグしか抜き出せません。階層的なタグ構造を総当たりで調べていきたい場合は再帰関数を定義して調べていきます。

import requests
from bs4 import BeautifulSoup

address = 'https://www.tuyano.com/index2?id=505001'
resp = requests.get(address)
data = resp.text

soup = BeautifulSoup(data, 'lxml')

def checkChildren(tag, n):
   try:
       for obj in tag.children:
           if obj.name != None:
               try:
                   print(('-' * n) + '<' + obj.name + ' class=' +
                         str(obj['class']) + '>')
               except KeyError:
                   print(('-' * n) + '<' + obj.name + '>')
           checkChildren(obj, n + 1)
   except AttributeError:
       pass
   
checkChildren(soup.body, 0)
繰り返し内で、obj[‘class']というようにしてclass属性の値を取り出していますが、これは「クラス名のリスト」として値が得られるので注意してください。

1つ目のtry~except文で、子ノードがなければ、childrenを呼び出そうとした段階でexcept AttributeError:にジャンプしてそのまま関数を抜けます。

AttributeErrorとは

属性(Attribute)参照に関するエラーです。
<オブジェクト>.<識別子>のようにメソッドなどを呼び出す際に、オブジェクトや識別子(属性やメソッド)の名前、オブジェクトの型を間違えている場合に発生します。


サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪