この記事ではPythonのXPathについて解説をしたいと思います。
XPathではWebスクレイピングをすることが出来ます。
PythonでWebスクレイピングをしたい。
Pythonで効率的にHTMLデータを解析したい。
今回の記事ではこのように思っている方に向けて、
【基礎】XPath、スクレイピングとは
【基礎】urllibやlxmlなどの必要なパッケージについて
【実践】スクレイピングをする方法
について解説をしていきます。
PythonでWebスクレイピングをしてみましょう!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他の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はスクレイピングでもよく使われていて、紹介した他にも様々な手法が使われています。
ぜひ調べてみてください。