全取材あり! | エンジニアになれるプログラミングスクールおすすめ5社まとめ

こんにちは、DAINOTE編集部のDAIです。

  • Pythonでスクレイピングしてみたい
  • そのためにBeautifulSoupを利用したい

という方は多いのではないのでしょうか。

そこで今回は、BeautifulSoupを利用した、簡単なスクレイピングの方法について解説したいと思います。

BeautifulSoupとは

BeautifulSoupとは、HTMLやXMLからデータを引き出すことができるライブラリです。

公式ドキュメント:Beautiful Soup Documentation
日本語役:Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新) »

公式ドキュメントを引用しつつ、、簡単に使い方を紹介します。

前提:BeautifulSoupだけでスクレイピングをできるわけではありません

まず、前提としてBeautifulSoupだけではスクレイピングできません。

一般的には、RequestsというHTTP通信ができるモジュールを利用して、HTMLのデータをスクレイピングしてきた後に、そのHTMLを整形するためにBeautifulSoupが利用されます。

ちなみにCSVにエクスポートする場合は、Pandasのようなライブラリが使われます。

 

BeautifulSoupの基本的な使い方

BeautifulSoupでよく使うメソッドをまとめてみます。

BeautifulSoupのインストール

BeautifulSoupをインストールします。

pip install beautifulsoup4

BeautifulSoupのインポートと初期化

BeautifulSoupをインポートします。

from bs4 import BeautifulSoup

HTMLを読み込む

実際にHTMLを読み込みます。

# こちらで用意したHTML

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""

# BeautifulSoupの初期化

soup = BeautifulSoup(html_doc, 'html.parser') # BeautifulSoupの初期化

HTMLファイルを整形する

普通にHTMLを読み込むと、整形されていないので、みやすいようにインデントされた形にします。

print(soup.prettify()) # HTMLをインデントすることができます。

こんな感じで表示されます。

<html>
<head>
 <title>
  The Dormouse's story
 </title>
</head>
<body>
 <p class="title">
  <b>
   The Dormouse's story
  </b>
 </p>
 <p class="story">
  Once upon a time there were three little sisters; and their names were
  <a class="sister" href="http://example.com/elsie" id="link1">
   Elsie
  </a>
  ,
  <a class="sister" href="http://example.com/lacie" id="link2">
   Lacie
  </a>
  and
  <a class="sister" href="http://example.com/tillie" id="link3">
   Tillie
  </a>
  ;
and they lived at the bottom of a well.
 </p>
 <p class="story">
  ...
 </p>
</body>
</html>

中のタグの内容を抽出する

titleタグの内容を取りたい場合は、soup.titleで取得できます。

soup.title#<title>The Dormouse's story</title>が抽出される

タグの要素だけ出力したい場合

 titleタグの中身の文字だけを取りたい場合は、soup.title.stringで取得できます。

例:The Dormouse’s story

soup.title.string
# The Dormouse's storyが出力される

複数のタグを取得する

複数のタグを取得する場合は、find_allメソッドを利用します。

soup.find_all("a") #[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] が出力される

 

応用 BeautifulSoupでスクレイピングする

では、実際にBeautifulSoupでスクレイピングしてみましょう。

今回は、PRTimesのプレスリリースを、一括ダウンロードすることをゴールにしていきましょう。

PRTimesのプレスリリースを一括ダウンロードする

まず、Requestsを利用して、PRTimesのプレスリリースのXMLデータを取得します。

株式会社プログリットのプレスリリース・ニュースリリース

RequestsでXMLファイルを読み込む

以下のように、HTMLファイルに該当するデータが変数に代入されていることを仮定します。

import requests

url = "https://prtimes.jp/companyrdf.php?company_id=20729"
res = requests.get(url).text

BeautifulSoupでHTMLを読み込む

これらのHTMLを、BeautifulSoupで利用できるようにします。

  • #1: ライブラリをインポートします
  • #2: HTMLを読み込みます
from bs4 import BeautifulSoup #1
soup = BeautifulSoup(res, 'html.parser') #2
中身を確認する場合は、printしてあげます。
print (soup)
出力結果はこんな感じになります。
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xml:language="ja"><channel rdf:about="https://prtimes.jp/company.20729.rdf"><title>株式会社プログリット【プレスリリース】 by PR TIMES</title><link>https://prtimes.jp</link><dc:create>info@prtimes.jp</dc:create><dc:rights>Copyright (c) PR TIMES Inc. All Rights Reserved.</dc:rights><dc:date>2019-10-19T12:49:39+09:00</dc:date><dc:language>ja-JP</dc:language><description>PR TIMES|株式会社プログリットのプレスリリース・ニュースリリース。</description><items><rdf:Seq><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000042.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000040.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000041.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000038.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000039.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000037.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000036.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000035.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000034.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000033.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000032.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000031.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000030.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000029.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000028.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000027.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000026.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000025.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000024.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000022.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000023.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000021.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000019.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000017.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000016.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000014.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000013.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000012.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000011.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000010.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000009.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000007.000020729.html"/><rdf:li rdf:resource="https://prtimes.jp/main/html/rd/p/000000006.000020729.html"/><rdf:li rdf:resource="http://prtimes.jp/main/html/rd/p/000000005.000020729.html"/><rdf:li rdf:resource="http://prtimes.jp/main/html/rd/p/000000004.000020729.html"/><rdf:li rdf:resource="http://prtimes.jp/main/html/rd/p/000000003.000020729.html"/></rdf:Seq></items></channel><item rdf:about="https://prtimes.jp/main/html/rd/p/000000042.000020729.html"><title>株式会社プログリットがプライバシーマークを取得</title><link>https://prtimes.jp/main/html/rd/p/000000042.000020729.html</link><description>[株式会社プログリット] [画像1: https://prtimes.jp/i/20729/42/resize/ ] プライバシーマーク取得の背景  弊社は2016年9月に創業してから、英語コーチングプログラム「プログリット」で今までに6,000名以上の生徒様の英語力...</description><dc:corp>株式会社プログリット</dc:corp><dc:date>2019-10-16T12:10:00+09:00</dc:date><date>2019-10-16</date></item><item rdf:about="https://prtimes.jp/main/html/rd/p/000000040.000020729.html"><title>英語コーチング「プログリット」がフリーランス向け支援パッケージ「ITプロトータルサポート」にて新提携サービスをリリース開始!</title><link>https://prtimes.jp/main/html/rd/p/000000040.000020729.html</link><description>[株式会社プログリット]   [画像1: https://prtimes.jp/i/20729/40/resize/ ]   提携サービス開始の背景  株式会社ITプロパートナーズが提供する「ITプロパートナーズ」には、30,000名以上もの起業家・フリーラ...</description><dc:corp>株式会社プログリット</dc:corp><dc:date>2019-10-08T10:30:00+09:00</dc:date><date>2019-10-08</date></item><item rdf:about="https://prtimes.jp/main/html/rd/p/000000041.000020729.html"><title>英語コーチング「プログリット」ビジネス英会話コースが厚生労働大臣指定「一般教育訓練給付制度」の対象講座に</title><link>https://prtimes.jp/main/html/rd/p/000000041.000020729.html</link><description>[株式会社プログリット] [画像1: https://prtimes.jp/i/20729/41/resize/ ] 対象講座の概要  プログリットが展開しているコースのうち、「ビジネス英会話コース(12週)」が厚生労働大臣指定の一般教育訓練給付制度対象講座と...</description><dc:corp>株式会社プログリット</dc:corp><dc:date>201

BeautifulSoupでHTMLを見やすくする (soup.prettify())

次に、BeautifulSoupでHTMLを見やすくします。普通にprintすると、取得したHTMLがひどく見えにくいので、prittifyメソッドを利用して、見やすくします。
出力結果は違いますが、こんな感じでHTML/XMLが見やすい形でインデントされて表示されます。

  • #1: soup.prettifyメソッドを利用して、HTMLを見やすくします(インデントつきで見えるようにします)
print(soup.prettify())
 <?xml version="1.0" encoding="UTF-8" ?>
...
<title>株式会社プログリットがプライバシーマークを取得</title>
<link/>https://prtimes.jp/main/html/rd/p/000000042.000020729.html
<description>[株式会社プログリット]
[画像1: https://prtimes.jp/i/20729/42/resize/ ]



プライバシーマーク取得の背景

 弊社は2016年9月に創業してから、英語コーチングプログラム「プログリット」で今までに6,000名以上の生徒様の英語力...</description>
<dc:corp>株式会社プログリット</dc:corp>
<dc:date>2019-10-16T12:10:00+09:00</dc:date>
<date>2019-10-16</date>
</item>
<item rdf:about="https://prtimes.jp/main/html/rd/p/000000040.000020729.html">
<title>英語コーチング「プログリット」がフリーランス向け支援パッケージ「ITプロトータルサポート」にて新提携サービスをリリース開始!</title>
<link/>https://prtimes.jp/main/html/rd/p/000000040.000020729.html
<description>[株式会社プログリット]
&amp;nbsp;

[画像1: https://prtimes.jp/i/20729/40/resize/ ]
...
 現在、多くの日本企業が海外進出拡大に強い意欲を持っていたり、海外との取引を増加させようとしています。日本...</description>
<dc:corp>株式会社プログリット</dc:corp>
<dc:date>2019-08-01T16:30:00+09:00</dc:date>
<date>2019-08-01</date>
</item>
<item rdf:about="https://prtimes.jp/main/html/rd/p/000000032.000020729.html">
<title>株式会社GRIT、事業拡大に伴う本社移転のお知らせ ~新本社のコンセプトは「融合」~</title>
<link/>https://prtimes.jp/main/html/rd/p/000000032.000020729.html
<description>[株式会社プログリット]
&amp;nbsp;
...
<dc:corp>株式会社プログリット</dc:corp>
<dc:date>2019-06-20T17:48:42+09:00</dc:date>
<date>2019-06-20</date>
</item>
<item rdf:about="https://prtimes.jp/main/html/rd/p/000000031.000020729.html">
<title>英語コーチング「PROGRIT(プログリット)」7月1日(月)六本木、大阪・梅田に2校舎同時オープン</title>
<link/>https://prtimes.jp/main/html/rd/p/000000031.000020729.html
<description>[株式会社プログリット]
...
<date>2016-08-22</date>
</item>
</rdf:rdf>

HTMLの中身を取得する

次に、HTMLの中身を取得します。

  • プレス名(title)
  • 概要(description)
  • 日付date)

をそれぞれ取得してみましょう。

上記のXMLを見る限り、itemタグの中にそれぞれtitle, description, dateが入っていますね。

なので、まずはitemを一つ一つ取得します。

複数のタグをリスト形式で取得する場合は、find_allメソッドを利用します。

  • #1: find_all(“タグ名”):タグ名に合致するXML/HTMLをリスト形式で取得する
items = soup.find_all("item") #1

それぞれfor文で回すと、それぞれのitemを1つ1つ取得することができます。

for item in items:
  print (item)

item以下にあるtitleなどのタグを取得したい場合は、以下のように取得します。

for item in items:
  print (item.title)
  print (item.description)
  print (item.date)

ただし、これだとHTMLのタグの部分も取得してしまうので、中身だけ取得する場合はstringを利用します。

for item in items:
  print (item.title.string)
  print (item.description.string)
  print (item.date.string)

出力結果は以下のようになります。

株式会社プログリットがプライバシーマークを取得
[株式会社プログリット]
[画像1: https://prtimes.jp/i/20729/42/resize/ ]
プライバシーマーク取得の背景...
2019-10-16

こんな感じで簡単にスクレイピングすることができるようになります!

関連記事