以下のようなhtmlから、より高度に値を選択取得する方法を確認する。
<html>
<head>
<title>
Test Page
</title>
</head>
<body>
<div class="main">
<p>
hello, world!!
</p>
</div>
<div class="sub">
<p>
sub text
</p>
</div>
</body>
</html>
サンプルコード
from bs4 import BeautifulSoup
doc = ['<html><head><title>Test Page</title></head><body>',
'<div class="main"><p>hello, world!!</p></div>',
'<div class="sub"><p>sub text</p></div>',
'</body></html>']
soup = BeautifulSoup(''.join(doc), "html.parser")
# divタグをすべて取得
print(soup.find_all("div")) # [<div class="main"><p>hello, world!!</p></div>, <div class="sub"><p>sub text</p></div>]
# pタグをすべて取得
print(soup.find_all("p")) # [<p>hello, world!!</p>, <p>sub text</p>]
# spanタグをすべて取得(例ではspanタグはないため[]が返る)
print(soup.find_all("span")) # []
# classがmainをすべて取得
print(soup.find_all(class_='main')) # [<div class="main"><p>hello, world!!</p></div>]
# idがmainをすべて取得(例ではmainはないため[]が返る)
print(soup.find_all(id='main')) # []
# divタグとclassがsubのものをすべて取得
print(soup.find_all('div', class_='sub')) # [<div class="sub"><p>sub text</p></div>]
# divタグかpタグのものをすべて取得
print(soup.find_all(['div', 'p'])) # [<div class="main"><p>hello, world!!</p></div>, <p>hello, world!!</p>, <div class="sub"><p>sub text</p></div>, <p>sub text</p>]
# divタグの始めに見つかったものを取得
print(soup.find("div")) # <div class="main"><p>hello, world!!</p></div>
# pタグをすべて取得
print(soup.find("p")) # <p>hello, world!!</p>
# divタグかpタグの始めに見つかったものを取得
print(soup.find(['div', 'p'])) # <div class="main"><p>hello, world!!</p></div>
import re
# 正規表現を使用して取得、classにmainかsubが含まれているものを取得
print(soup.find_all(class_=re.compile('.*main.*|.*sub.*'))) # [<div class="main"><p>hello, world!!</p></div>, <div class="sub"><p>sub text</p></div>]
# selectはCSSセレクタ
# classがmainを取得
print(soup.select(".main")) # [<div class="main"><p>hello, world!!</p></div>]
# idがsubを取得
print(soup.select("#sub")) # []