BeautifulSoup

Python 「Beautiful Soup」 で HTML / XML を解析 基本的な処理2

以下のような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")) # []