Python BeautifulSoupでWebスクレイピング


インストール

pip install beautifulsoup4

サンプルのHTML

こちらを例にして解説していきます。

html = """
<html>
  <head>
    <title>新刊のご案内</title>
  </head>
  <body>
  <p class="title">
    <b>新刊のご案内</b>
  </p>

  <p class="books">
    〇〇出版社から
    <a href="http://sample.com/book_11" class="book" id="link1">とても面白い本</a>、
    <a href="http://sample.com/book_12" class="book" id="link2">そこそこ面白い本</a>、
    <a href="http://sample.com/book_13" class="book" id="link3">たぶん面白い本</a>
    が新たに出版されました。
  </p>

  </body>
</html>
"""

スープの作成

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)

タグを取得

print(soup.head) #=>
"""
<head>
<title>新刊のご案内</title>
</head>
"""

print(soup.title) #=> <title>新刊のご案内</title>

print(soup.p) #=>
"""
<p class="title">
<b>新刊のご案内</b>
</p>
"""

タグ名を取得

print(soup.title.name) #=> title

テキストを取得

print(soup.title.string) #=> 新刊のご案内

親タグを取得

print(soup.title.string) #=> 新刊のご案内

クラス名とid名を取得

print(soup.a['class']) #=> ['book']

print(soup.a['id']) #=> link1

id名やクラス名でタグを取得

クラス名の場合は「class_」として指定します。予約語の「class」ではありません。

print(soup.find(id="link2")) #=> <a class="book" href="http://sample.com/book_12" id="link2">そこそこ面白い本</a>

print(soup.find(class_="title")) #=>
"""
<p class="title">
<b>新刊のご案内</b>
</p>
"""

複数のタグを取得

print(soup.find_all('a')) #=>
"""
[<a class="book" href="http://sample.com/book_11" id="link1">とても面白い本</a>,
 <a class="book" href="http://sample.com/book_12" id="link2">そこそこ面白い本</a>,
 <a class="book" href="http://sample.com/book_13" id="link3">たぶん面白い本</a>]
"""

属性を取得

print(soup.a.get('href')) #=> http://sample.com/book_11