こんにちは、ミナピピン(@python_mllover)です
前回はWEB上のデータを取得作業を行ったので今回はスクレイピングで取得したhtmlデータをbeautifulsoupというライブラリを使って解析する方法について紹介したいと思います~
前回の記事:PythonでのWebスクレイピングには「requests」がめっちゃ便利という話
Contents [hide]
PythonでのHTMLの分析にはBeautiful Soup
基本的にスクレイピングで抜き出したWebデータはタグがいっぱいあって人間が見るとかなり見にくく必要なデータだけでピンポイントで抜き出すのは非常に困難です。そんな時に役立つのがPythonで、PythonにはHTMLデータを分析するには「beautiful soup」というライブラリが用意されておりこれが非常に便利です。「Beautiful Soup」にはHTMLを解析するための様々なメゾットやセレクタがあるため、より効率的に解析することができます。
BeautifulSoupのインストール
早速BeautifulSoupをインストールしましょう。インストールはコマンドプロンプトから「 pip install beautifulsoup4 」でインストールします。
# beautiful soupのインストール
$ pip install beautifulsoup4
requestsがない人は一緒にインストールしておいてください。anacondaで環境構築している人は既にどちらもインストールされているので問題ありません
関連記事:【Python】Anacondaのインストールと初期設定から便利な使い方までを徹底解説!
関連記事:PythonでのWebスクレイピングには「requests」がめっちゃ便利という話
BeautifulSoupの使い方
# ライブラリの呼び出し
import requests
from bs4 import BeautifulSoup
# YahooのサイトのHTMLを取得
r = requests.get('https://www.yahoo.co.jp/')
# 取得したHTMLデータをBeautifulSoupで解析できる形に変換
yahoo=BeautifulSoup(r.text,'html.parser')
二つ目の引数は解析の種類を表しています。他にもあるみたいですが効率を気にせずとりあえず解析してる俺スゲーしたいってだけならこれで問題ないと思います。
そしてBeautifulSoup が返してくれる変数には検索しやすいメソッドが含まれています。find()は引数で指定したタグを検索して最初にヒットしたものを返してくれます。
# htmlデータの中から最初のaタグを抽出する
yahoo.find('a')
<実行結果>
<a href=”https://www.yahoo-help.jp/”><nobr>ヘルプ</nobr></a>
他にも画像を検索したいときは、画像はimgタグなのでyahoo.find('img')
にするとできます。そして、htmlの中から特定のタグを含む要素を全て検索したいときはfind_all()を使います。戻り値で返ってくる検索結果はリストで返されます。
# htmlの中からaタグを含むものを全て取得する
yahoo.find_all('a')
<実行結果>
[<a href=”https://www.yahoo-help.jp/“><nobr>ヘルプ</nobr></a>, <a href=”https://www.yahoo-help.jp/app/answers/detail/p/533/a_id/43883“>Internet Explorerの互換表示について</a>, <a href=”https://tourdetohoku.yahoo.co.jp/storyteller/2018/“>被災地・宮城で聞いた「未来につなげたい思い」とは</a>, <a href=”https://rdsig.yahoo.co.jp/smptop/event/201803_bousai/pctl/RV=1/RU=aHR0cHM6Ly9ib3VzYWkueWFob28uY28uanAvcHIvMjAxODAzLw–“>あなたの防災力は何点?「全国統一防災模試」に挑戦</a>,…
タグ内の属性を使用して抽出
例えばaタグにあるhref=’〇〇’みたいなリンクのパスを取得する際は以下のように記述する
soup.find('a').get('href')
もちろんhrefだけでなくtitleなどのattribute(属性)を指定して検索することも可能。
タグ内のIDを使って検索
またデベロッパーツールで<div id=’〇〇’>~~~~~~</div>みたいな内容の要素を取得したい場合は以下のように記載します。
# タグのIDを使って検索する
soup.find(id="id名")
テキストを抽出
要素内のテキストのみを抽出する際は引数の.textで可能
例:
soup.text
実際の使用例
使用例としてrequests+beautifulsoupでヤフーのトップページにあるリンクを全て取得してみます。
import requests
from bs4 import BeautifulSoup
url = 'https://www.yahoo.co.jp/'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'lxml') #要素を抽出
l_data = soup.find_all('a')
l_list = []
for l in l_data:
l_list.append(l.get('href'))
print(l_list)
<実行結果>
['https://www.yahoo.co.jp',
'https://paypaystep.yahoo.co.jp/?sc_e=ytmh_p2c_web',
'https://card.yahoo.co.jp/service/redirect/top/',
'https://mail.yahoo.co.jp/',
'https://travel.yahoo.co.jp/ikCo.ashx?cosid=y_010017&cosuid=ytmh&surl=%2F&sc_e=ytmh',
'https://auctions.yahoo.co.jp/',
'https://shopping.yahoo.co.jp/?sc_e=ytmh',
'https://search.yahoo.co.jp/',
'https://search.yahoo.co.jp/image',
'https://search.yahoo.co.jp/video',
~~~
]
終わり
大体使うのはリンク(a)・画像(img)・表/テーブル(table) でしょう。ループを組み合わせると自動化処理ができますね。
PythonでのスクレイピングやBeautifulSoupの使い方は下の「Pythonによるスクレイピング&機械学習開発テクニック増補改訂」という本が分かりやすかったので、紹介しておきます。
関連記事:【Python】BeautifulSoupでスクレイピングしたhtmlが文字化けしたときの解消法
関連記事:【Python】CoinGeckoのAPIからビットコイン・アルトコインの価格データを取得する
関連記事:【Python】pandasで日経平均の株価データをスクレイピングする
コメント