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

Pocket

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へ戻る

 

 

この記事を読んでいる人はこんな記事も合わせて読んでいます♪

  • ストレージタイプHを服用した感想、喉のつかえ感に効くのか!?ストレージタイプHを服用した感想、喉のつかえ感に効くのか!? どうも!筆者の鹿丸(しかまる)です!   今回はストレージタイプHを服用した感想を書きたいと思います。   というのもわたくし鹿丸はですね、すでに高校2年生の頃から喉のつかえ感に苦しめられておりまして今回ストレージタイプHの「喉のつかえ感や異物感に効く!」という宣伝文句を見て、速攻Amazonで買ってみたわけなんです! &nb […] Posted in 未分類
  • 数学が苦手な社会人のためのオススメ数学参考書ベストセレクション数学が苦手な社会人のためのオススメ数学参考書ベストセレクション 「社会人になったけれども、やっぱりあの苦手だった数学を学び直したい!」そんな風に考えているのは筆者だけではないはずです。「まずは高校数学を一通り学びなおしたい!」そんな方に役立つ「超優良」数学参考書を集めてみました。ちなみにここで紹介するオススメの数学書たちは全て筆者が実際に愛用しているものです。 おすすめの超使える数学参考書 『長岡先生の授業が聞ける高校数学の教科書 […] Posted in 未分類
  • Python3超入門【第3回】Python3超入門【第3回】 さてPython3超入門シリーズも、【第3回】になりました。今回もわかりやすく説明するので、よろしくお願いします。 <関連リンク> Python3超入門【第1回】 Python3超入門【第2回】 今回は、リストというデータの入れ物について学びます。   [広告]確かな力が身につくPython「超」入門 […] Posted in 未分類
  • 【数学が苦手な方向け】社会人のための高校数学再入門おすすめ勉強法&書籍紹介【数学が苦手な方向け】社会人のための高校数学再入門おすすめ勉強法&書籍紹介 はじめに 高校数学でつまづいてしまった苦い経験はあるのだけれども、社会人になった今こそ、教養として、あるいは、実務のために高校数学に再入門したい方は案外多いのではないでしょうか。 かく言う筆者もその一人です。私の場合は数学ほど美しくパワフルな分野を中学レベルまでしかろくにできないまま、人生を過ごすのはまっぴらごめんだ!と感じています。そして雑学はあまり意味がな […] Posted in 未分類
  • 大学受験に超役立つ世界史オススメ参考書紹介大学受験に超役立つ世界史オススメ参考書紹介 大学受験にめっちゃ役立つ世界史のオススメ参考書をご紹介! こんにちは!筆者の鹿丸です! 大学受験のとき、世界史!苦戦した記憶がございます!ものすごい暗記量ですもんねー。マジで!でもビビる必要はありません。暗記で解決できる科目というのは優しい科目です。 東大理科の数学の入試問題なんて暗記力だけでは突破できないわけですし。そういうのに比べたらぜんぜんやさしい科目。そ […] Posted in 未分類
カテゴリー: 未分類 パーマリンク

コメントを残す

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

CAPTCHA