ホーム >  Python >  Beautiful Soup4でWebサイト解析

投稿日:   |  最終更新日:

Beautiful Soup4でWebサイト解析

PythonWebスクレイピング

Pythonでスレイピングを行います。今回は、Beautiful Soup4を使ってWebサイトを解析します。

Beautiful Soup4でWebサイト解析

Beautiful Soupとは、HTMLの内容を解析するためのPythonライブラリです。

前回は、RequestsでWebページのデータを取得しました。今回は、HTMLを解析して現在のページから記事に関する情報を抽出します。

前提

①仮想環境、本番環境どちらでも構いませんが、CentOS7にPython3とvenvがインストールされているものとします。VPSに作った方法ですが、共通ですので以下をご参考に。

ConoHaのVPSにPython3環境を作る

②スクレイピングに使用するPythonパッケージ(Requests、Beautiful Soup4)をインストールします。

Pythonのウェブスクレイピング環境を作る(Requests、Beautiful Soup4)

ホスト環境

ホスト環境はUbuntuですが、WindowsでもMacでもOKです。

OS Ubuntu 16.04.1 LTS 64bit
Virtualbox 5.1
Vagrant 1.9.5

ゲスト環境

OS CentOS 7.1.1503
Python 3.6.1
pip 9.0.1
Webサーバ Apache/2.4.6 (CentOS)
mod_wsgi 4.5.17

Beautiful Soup4でサイトを取得

①venvの仮想環境から、そのままコマンドでpythonの対話モードを起動します。

python

②以下のコードを記述して実行します。RequestsオブジェクトのcontextにHTMLが入ります。そのデータを元にBeautifulSoupオブジェクトを生成します。

>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('https://hombre-nuevo.com/python/webscraping0002/')
>>> soup = BeautifulSoup(r.content, 'html.parser')

titleタグの情報を取得します。

>>> title = soup.title

オブジェクトの型を確認します。型はTag型です。

>>> type(title)
<class 'bs4.element.Tag'>

タイトルタグを表示します。

>>> print(title)
<title>Beautiful Soup4でWebサイト解析 | Hornet|静岡拠点のWeb、ホームページ制作</title>

タイトルタグの内容を表示。

>>> print(title.text)
Beautiful Soup4でWebサイト解析 | Hornet|静岡拠点のWeb、ホームページ制作

サイトの一件分のデータを取得

soupオブジェクトのfind()は、任意のタグの情報を取得します。id、classなどhtmlの属性とタグ情報を取得します。

>>> div = soup.find('div', class_='div_index')

class属性の場合だけPythonの予約語のclassとかぶります。classを指定する場合は「class_」と指定します。

div.find(‘li’)でdivタグの中の最初のliタグを取します。

>>> li = div.find('li')

aタグの中の文字列を表示します。

>>> print(li.a.text)
Beautiful Soup4でWebサイト解析

文字列の中のsplit()で日付とタイトルに分割して、それを表示します。

>>> li.a.text.split(maxsplit=1)
['Beautiful', 'Soup4でWebサイト解析']

サイトの全データを取得

soupオブジェクトには、「find_all()」というメソッドがあります。これは、指定した条件に合致するすべてのタグを取得します。以下の例では、すべてのliタグを取得します。また取得したデータをCSV形式で出力します。

>>> div = soup.find('div', class_='readingContent01')
>>> for li in div.find_all('li'):
...     url = li.a['href']
...     date, text = li.a.text.split(maxsplit=1)
...     print('{},{},{}'.format(date, text, url))
... 
トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告