Python3|Beautiful Soup4の基本操作|スクレイピングに便利!

ブログアクセスアップの方法とブログ記事の書き方講座

Python3におけるBeautiful Soupの基本操作解説

Beautiful Soupのバージョン4.xを対象に、その基本的な操作をわかりやすく解説しています。

Beautiful Soup4のインストール

pip install beautifulsoup4

まだインストールされていない方はrequestsモジュールも一緒にインストールしておくと便利です。Beautiful Soup4とrequetsモジュールはセットで利用する機会が多いからです。

<参考:requestsモジュールのインストール>

pip install requests

テスト用の模擬htmlドキュメント

下記のテスト用模擬htmlドキュメントを対象にBeautiful Soup4を使って簡単なスクレイピングをしてみます。

Beautiful soup4のインポート

from bs4 import BeautifulSoup

<参考:requestsのインポート>

import requests

とりあえずヤフーニュースを取得しタイトルタグを表示してみる

【サンプルプログラム1-1】

<実行結果>

<title>Yahoo!ニュース</title>

<コードの解説>

requests.get(url)でWEBページを取得しています。戻り値はResponse型のオブジェクトです。

ちなみに、r.headers[‘content-type’]と書くとHTTPヘッダーを辞書型で取得できます。また、r.encodingとResponseオブジェクトのencoding属性を指定するとエンコーディングを取得できます。

str型にデコードされたレスポンスボディ、つまりhtml本文を取得するにはr.textと書きます。

そして、Beautiful Soup4のコンストラクタにはstr型のhtmlドキュメントとパーサーを指定します。

htmlをパースする場合は‘html.parser’をXMLをパースする場合には‘xml’を指定します。

模擬htmlドキュメントを使ったBeautiful Soup4の基本操作解説

まずはBeautifulSoup.prettify()で読み込んだ模擬htmlを階層表示してみます。

【サンプルプログラム1-2】

実行結果は割愛しますが、soup.prettify()で読み込んだhtmlドキュメントを階層表示することができます。

では続いて、最も基本的なBeautiful Soup4の使い方を見ていきましょう。

任意のタグを取得する基本的な方法

上記の【サンプルプログラム1-2】のsoup.prettify()の部分をsoup.~と書き換えたと思って読んでいただければと思います。

# タイトルタグを取得する。
soup.title # <title>bs4の練習</title>

# タイトルタグのタグ名を取得する。
soup.title.name # title

# タイトルタグの内容を取得する。
soup.title.string # bs4の練習

# 最初に見つかったulタグ内にある全ての文字列を結合した値を取得する。
soup.ul.text
# 焼肉定食
# お刺身定食
# かつ丼

# h1タグの親要素のタグ名を調べる。親要素はparentで取得できます。
soup.h1.parent.name # body

# .parentsで任意のタグの全親要素を取得できます。この例では<li>の親要素全てを表示します。
for prt in soup.li.parents:
    if prt is None:
        print(prt)
    else:
        print(prt.name)
# ul
# p
# body
# html
# [document]

# 最初にhitしたulタグの子要素の一覧をリスト型で取得する。
soup.ul.contents
# [‘\n’, <li>焼肉定食</li>, ‘\n’, <li>お刺身定食</li>, ‘\n’, <li>かつ丼</li>, ‘\n’]

# 全てのulタグの子要素(li)を取得し、取得したリストのインナーテキストだけを表示する。
for i in soup.find_all(‘ul’):
    for j in i.contents:
        print(j.string)
# 焼肉定食
# お刺身定食
# かつ丼
# グーグル
# ヤフー
# ライブドア天気情報

# 最初にhitしたaタグを取得する。
soup.a # <a href=”http://google.com”>グーグル</a>

soup.asoup.find(‘a’)と等価です。

# 最初にhitしたaタグのhref属性の値(つまりURL)を取得する。
soup.a.get(‘href’) # http://google.com

# 全てのaタグを取得する。戻り値はリスト型。
soup.find_all(‘a’)
# [<a href=”http://google.com”>グーグル</a>, <a href=”http://yahoo.co.jp”>ヤフー</a>, <a href=”http://weather.livedoor.com/”>ライブドア天気情報</a>]

# 全てのh2要素を検索し、class属性の値が”menu”のものだけ返す。
# classではなくclass_としている点に注意。戻り値はリスト型。
soup.find_all(‘h2′, class_=’menu’) # [<h2 class=”menu”>今日のお品書き</h2>]

# idをキーに要素を取得。
soup.find_all(id=’main’)

# 属性の値をキーに要素を取得。属性であればなんであれ指定できる。
(例:find_all(src=’hoge.jpg’))
soup.find_all(href=’http://google.com’) # [<a href=”http://google.com”>グーグル</a>]

# 複数の属性を指定して絞り込み検索もできる。
soup.find_all(href=’http://google.com’, id=’google’)

尚、soup.get_text()でhtmlドキュメント内のタグを除いた全てのテキストを取得することができます。

htmlドキュメント内の全てのURLを取得するには?

全てのURLを取得するには下記のサンプルプログラムのように書きます。

【サンプルプログラム1-3】

<実行結果>

http://google.com
http://yahoo.co.jp
http://weather.livedoor.com/

正規表現やCSSセレクタによる要素の検索

<実行結果>

[<title>bs4の練習</title>, <li>焼肉定食</li>, <li>お刺身定食</li>, <li>かつ丼</li>, <li><a href=”http://google.com”>グーグル</a></li>, <li><a href=”http://yahoo.co.jp”>ヤフー</a></li>, <li><a href=”http://weather.livedoor.com/”>ライブドア天気情報</a></li>]
[<h2 class=”menu”>今日のお品書き</h2>]
[<a href=”http://google.com”>グーグル</a>, <a href=”http://weather.livedoor.com/”>ライブドア天気情報</a>]
[<a href=”http://google.com”>グーグル</a>]
[<h2 class=”link”>おすすめリンク集</h2>]

Python3リファレンスTOPへ戻る

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA