Pythonの正規表現を使ってHTMLタグの要素をカンタン取得!【サンプルコード有り】

はじめに

前回、pythonの標準ライブラリにあるurllibのrequestを使ってHTMLを取得する流れをご説明しました。HTML取得まではライブラリの力を借りて、スムーズに言ったと思われたのではないでしょうか?しかし、取得したHTMLから必要な内容を取り出す際に、前回は組み込み関数であるsplit()を使用しましたが、取り出す内容が複雑になればなるほどこうしたカンタンな内容では難しくなっていきます。

世の中のWebページは複雑化の一途をたどっています。各サイトマスターがユーザーにより魅力的なサイトを作成しようと様々な趣向を凝らす中で、数年前より更に複雑なWebサイトをよく見かけるようになりました。この複雑化により、スクレイピングで狙った内容を取得する難易度はどんどn上がっています。

本記事ではスクレイピングしたHTMLから要素を取得する方法として正規表現を用いる方法をご紹介します。最初はわけのわからない呪文のように感じるかもしれませんが、使用方法を理解するととても強力な武器となりますので、ぜひ投げ出さないでください!

Pythonの正規表現を使ってHTMLタグの要素を取得本気記事の目的

正規表現はざっくり言えばプログラミングにおけるパターンマッチングのための手法です。実は古くから使われる中で発展してきた方法で、由緒正しいのですが、その一方で初心者には高い敷居を感じさせる方法です。なぜ正規表現を使うかといえば、要素取得を行う上で、特定のタグとタグの間に挟まれた要素を取得したいとします。そうしたときにタグにパターンマッチさせ、その間にある要素を取得する、といった使い方をします。

この辺はなかなか口で言われてもわからないと思いますので、ソースを追いながらご説明していきたいと思います。

Pythonの正規表現を使ってHTMLタグの要素を取得する処理の流れ

それでは処理の流れをご説明します!

正規表現操作を行うモジュールなどをインポートする

まず正規表現操作を行うモジュール「re」をインポートします。メールの返信のような感じですが、正規表現がRegexである点からこの名前がつけられたのだと思います。

 

指定のサイトからhtmlをダウンロードしてデコードする

この辺の処理は前回と同じです。ライブラリの力を借りれば数行でできます。

 

正規表現でtitleタグの間の要素を取得し、タグを除去する

ぱっと見、何かよくわからない呪文に見えますが、この部分が正規表現になります。reモジュールのsearchメソッドで正規表現で第一引数で指定された部分を取得します。

 

pring関数で標準出力に出力する

おなじみのprint関数で出力します。

Pythonの正規表現を使ってHTMLタグの要素を取得するソースコード

それではソースコードです!

import re
from urllib import request

html = request.urlopen('https://jidouka-labo.com/')
contents = html.read()

htmltxt = contents.decode()

title = re.search(r'<title>(.*?)</title>',htmltxt).group(0)
title = re.sub(r'<(.*?)>',"",title)

print(title)

おわりに

所見の正規表現はわけのわからない呪文の用に見えたかもしれません。正規表現を完全に理解するのは大変ですが、参考サイトとして以下のQiitaのページを載せておきます。

分かりやすいpythonの正規表現の例

また、参考書籍として以下の本もご紹介します。

次回以降、正規表現の有用な使い方などご紹介していければ、と思います。