Python:BS4で特定のクラス内のあるクラスを取り出す

Pythonのロゴ Python

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')
	:
	:

コメント

タイトルとURLをコピーしました