【Python入門】XPathでスクレイピングする手順をわかりやすく解説!

この記事ではPythonのXPathについて解説をしたいと思います。

XPathではWebスクレイピングをすることが出来ます。

PythonでWebスクレイピングをしたい。
Pythonで効率的にHTMLデータを解析したい。

今回の記事ではこのように思っている方に向けて、

【基礎】XPath、スクレイピングとは
【基礎】urllibやlxmlなどの必要なパッケージについて
【実践】スクレイピングをする方法

について解説をしていきます。

PythonでWebスクレイピングをしてみましょう!

なお、Pythonの記事については、こちらにまとめています。

目次

XPathとは

XPath(XML Path Language)は、XMLの中の要素や属性などを指定するための言語です。

XMLでしか使えないようにも見えますが、HTMLもXMLの一種としてみなすことでHTMLのコードに対しても使うことが出来ます。

このXPathを使うことができればHTMLのコードにある特定の要素や属性のデータを取得することが出来ます。

HTMLについて分からない方は、ぜひこちらの記事をご覧ください。

スクレイピングとは

スクレイピングとは、特定のWebサイトから必要な情報を抽出することを言います。

Webサイトから必要な情報だけをスクレイピングして新しくスマートフォン向けのWebサイトを作ったり、会社に関係する内容だけをスクレイピングしてデータの解析に役立てたりすることが出来ます。

詳しくはこちらの記事をご覧ください。

スクレイピングに必要なパッケージ

Pythonでスクレイピングを行うためにはいくつかの方法があります。

中でも今回のXPathを使ってスクレイピングをするためには、urllibとlxmlを使う必要があります。

urllibでは、インターネット上からHTMLコードを取得します。

lxmlでは、取得したHTMLコードを解析して必要な情報だけを取り出します。

それではそれぞれのパッケージについて見ていきましょう。

urllibとは

urllibはPythonからURLにアクセスしたり、インターネット上のファイルを取得したりすることができるパッケージです。

特にurllib.requestを使って、特定のページのHTMLコードを取得します。

詳しくはこちらの記事をご覧ください。

lxmlとは

lxmlはXMLの構文を解析するためのパッケージです。

今回は特に、lxml.htmlを使って、HTMLコードを解析していきます。

lxmlは標準でプリインストールされていないので、pipを使って自分でインストールをする必要があります。

このコマンドを実行してインストールをしておきましょう。

pip install lxml

スクレイピングをする方法

それでは早速スクレイピングをしてみましょう。

ここからは順を追って解説していきます!

urllibとlxmlをimportする

まずは必要なパッケージを使えるようにimportをしておきましょう。

from urllib import request
from lxml import html

importの方法についてはこちらの記事をご覧ください。

HTMLを取得する

次は目的のサイトのHTMLを取得してみましょう。

今回は example.com をスクレイピングしてみます。

こちらのコードをご覧ください。

from urllib import request
from lxml import html

URL = "http://www.example.com"
data = request.urlopen(URL)
html = data.read()
print(html)

実行結果

b'<!doctype html>n<html>n<head>n    <title>Example Domain</title>nn    <meta charset="utf-8" />n    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />n    <meta name="viewport" content="width=device-width, initial-scale=1" />n    <style type="text/css">n    body {n        background-color: #f0f0f2;n        margin: 0;n        padding: 0;n        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;n        n    }n    div {n        width: 600px;n        margin: 5em auto;n        padding: 50px;n        background-color: #fff;n        border-radius: 1em;n    }n    a:link, a:visited {n        color: #38488f;n        text-decoration: none;n    }n    @media (max-width: 700px) {n        body {n            background-color: #fff;n        }n        div {n            width: auto;n            margin: 0 auto;n            border-radius: 0;n            padding: 1em;n        }n    }n    </style>    n</head>nn<body>n<div>n    <h1>Example Domain</h1>n    <p>This domain is established to be used for illustrative examples in documents. You may use thisn    domain in examples without prior coordination or asking for permission.</p>n    <p><a href="http://www.iana.org/domains/example">More information...</a></p>n</div>n</body>n</html>n'

これは先程紹介したurllibの解説記事とほぼ同じコードになります。

URLを指定して、そこからダウンロードしたHTMLを表示させています。

インターネット上からHTMLを取得することは出来たので、次はこのHTMLコードから必要な部分を抽出します。

今回はh1を抽出してみましょう。

使いたい要素を指定する

先程まではすべてurllibを使った操作でしたが、これからはlxmlを使ってHTMLの必要な部分のみを抽出してみます。

こちらのコードをご覧ください。

from urllib import request
from lxml import html

URL = "http://www.example.com"
data = request.urlopen(URL)
raw_html = data.read()
html = html.fromstring(str(raw_html))
title = html.xpath("/html/body/h1")
print(title)

実行結果

Example Domain

このコードでは、取得したHTMLのコードから、lxml.htmlのXPathを使ってh1を取得しています。

無事に取得出来ていますね。

ややこしいコードに見えますが、基本的にはダウンロードしたコードにXPathで指定した形式の部分をtitleに入れているだけの作業です。

まとめ

この記事ではPythonでXPathを使う方法について解説をしてきました。

XPathやスクレイピングとは何かについて分かっていただけたでしょうか。

Pythonはスクレイピングでもよく使われていて、紹介した他にも様々な手法が使われています。

ぜひ調べてみてください。

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次