日本語 English
インターステラ株式会社の技術ブログです

【PythonでWebスクレイピング その4】HTMLソースの取得と解析

こんにちは。阿形です。
前回までで、PythonからWebブラウザを制御することができるようになりました。
今回からは、スクレイピングで最も重要な、HTMLソースを取得して解析するところをやってみようと思います。

HTMLソースの取得

前回までのコードを改めて。
本ブログサイトのトップページを開くところまでやっておきます。
ついでで前回までには使用していなかった、HTMLを解析するBeautifulSoup4も先に読み込んでおきます。
ソースだけ提示していますが、Pythonの対話モードで試してもらうといいと思います。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
import bs4


options = Options()
options.binary_location = '/usr/bin/chromium-browser'
driver = webdriver.Chrome(options=options)

driver.get('https://blog.interstellar.co.jp/')

さて、ここまででブラウザでページを開くところまで進みました。
開いたページのソースは以下で取得できます。

html = driver.page_source

簡単ですね。
これでhtmlにテキストデータとして格納されます。
試しにprintで表示してみるとソースがそのまま表示できます。

print(html)

ソースの解析

HTMLソースがテキストデータとして手に入ったので、正規表現など駆使すればどうとでもなるところまで来ました。
ただ、HTMLのタグを解析するのにいちいち自分で書くのも面倒なので、便利なツールを使用して解析してみましょう。
ここではBeautifulSoup4というものを使用します。
最初のPythonコードに書いた

import bs4

で読み込んだやつですね。

BeautifulSoup4の使い方

まず先程取得したhtmlをパーサーに食わせて初期化します。

soup = bs4.BeautifulSoup(html, 'html.parser')

これで初期化は完了です。
いろいろ解析してみましょう。

特定のタグの取得

まずは簡単な例で、ページタイトルを取得してみましょう。
タイトルは<title>〜</title>なので、以下のように取得できます。

title = soup.find('title')

このままprintしてみるとこんな感じで出力されます。

print(title)
<title>INTERSTELLAR BLOG インターステラ株式会社 技術ブログ</title>

そのままだとタグが含まれてしまうので、テキストだけ抜き出したい場合は以下のようにして取得できます。

print(title.text)
INTERSTELLAR BLOG インターステラ株式会社 技術ブログ

タグの内側を取得する方法は他にもcontentsやstringがありますが、ちょっとややこしいのでここでは割愛。

タグのリストを取得

titleタグは1ページに一つしかありませんが、リストされた記事を全部取得したいというような場合は、同一のタグが複数あると思います。
このような場合にはfind_allを使用します。
試しに本ブログサイトトップページから記事リストを取得してみましょう。
HTMLソースを見ると、記事のリストは <article class=”archiveList”> 〜</article>でくくられているので、以下のようにしてリストを取得します。

article_list = soup.find_all('article')

リストから個別の要素を抜き出し

記事のリストを取得できましたが、これだと記事タイトルや日付なども一緒になってしまっているので、それぞれの要素を抜き出してみましょう。
リストなので、forループで処理する事ができます。
記事タイトルだけ抜き出すには以下のコードで取得できますね。

article_list = soup.find_all('article')

for article in article_list:
    print(article.find('h2').text)

属性で検索

これまではタグそのもので検索していましたが、classなどの属性でも検索ができます。
例えばクラスがarchiveList__textの要素を取得する場合は以下のようになります。

soup.find(attrs={'class':'archiveList__text'})

まとめ

今回はBeautifulSoupの使い方について説明しました。
ここまででかなりスクレイピングの基本的な部分はだいたいクリアできたかなと思います。
このシリーズをもう少し続けるかどうかは作業時間次第ですが、まだPythonから直接ソースを取得する方法をやっていないので、時間ができたらそちらの記事を書いてみようかと思います。

PAGE TOP