PythonのBeautifulSoup4の利用例。特定のクラス内のあるクラスを取り出したい時。
次のHTMLを例にとって「ギリシャ神話」の文字列部分を取り出したいとする。
<ol> <li class="best1"><td class><p class="waku">グリム童話</p><p class="waku">怖い話が多い</p></td><tr> <li class="best2"><td class><p class="waku">ギリシャ神話</p><p class="waku">神々の名前が漫画のキャラに使われていたりする</p></td><tr> </ol>
段階を踏んで取り出すと分かりやすい。
(1)liタグのbest2クラスの部分を取り出す
(2)取り出した部分から、pタグのwakuクラス部分を取り出す
まず、liタグのクラスbest2の部分を取り出す。
str = soup.find("li", class_="best2")
次にpタグのwakuクラス部分を取り出す。
str = str.find("p", class_="waku")
実行結果
ギリシャ神話
サンプルコード
上記例では、findを使って取り出しているので、最初に見つかった部分しか取り出せない。
例えば、liタグのbest2クラス内にあるpタグでwakuクラス全てを取り出したい場合は次のようにfind_allを使う。
# h2タグのwakuクラスの部分のみ取り出したい str = soup.find("li", class_="best2") strs = str.find_all("p", class_="waku") # 画面に表示 print(strs[0].text) print(strs[1].text)
find_allの戻り値はリスト型なので、添え字を使って取り出したデータにアクセスできる。
実行結果
ギリシャ神話
神々の名前が漫画のキャラに使われていたりする
ソースコード全体
今回のサンプルは、URLからHTMLを取得していないため、実践的ではない。
本来なら以下のようにurllib.requestをプログラムの先頭で読み込んで、HTMLコード取得となる。
import urllib.request from bs4 import BeautifulSoup # HTMLを取得するサイトURL url = "https://???????.com/" # HTMLデータを取得する res = urllib.request.urlopen(url) html = BeautifulSoup(response, 'html.parser') : :
コメント