スクレイピングでデータを収集するためには、HTMLで書かれたWebページの文書構造を理解し、どこに目的のデータが記載されているかをコンピュータに教えてやる必要があります。このページではスクレイピングに最低限必要なHTML/CSSの知識をまとめています。
HTML
HTMLとはHyper Text Markup Languageを略したもので、Webページを表現するために用いられます。
タグ
html文書は <>と</>で囲まれる形で構造化されています。<>や</>の部分をタグといい、タグの中で括られたもの全体を要素といいます。
- htmlタグで囲まれたhtml要素:<html>と</html>で囲まれた部分全体
- bodyタグで囲まれたbody要素:<body>と</body>で囲まれた部分全体
<>を開始タグ、</>を終了タグといいます。htmlドキュメントは基本的に<html>という開始タグと</html>という終了タグで囲まれています。以下の例では
- htmlタグの中に、headタグ、bodyタグ
- headタグの中にtitleタグ
- bodyタグの中にh1タグ、liタグが2つ
が入った入れ子構造になっています。
<html> <head> <title>タイトル</title> </head> <body> <h1>1ページ目</h1> <li><a href="https://walkintheforest.net">リンク先1</a></li> <li><a href="https://walkintheforest.net/what-is-r/">リンク先2</a></li> </body> </html>
属性と値
以下のように記述することで要素に属性と値を付与することができます。
<要素名 属性="値">
a要素のhref属性にurl文字列を値として付与する場合は以下のように記述します。
<a href="https://walkintheforest.net">リンク先1</a>
スクレイピングによるHTML構造の抽出
スクレイピングによりデータを抽出するということは、以下のいずれかを行うことになります。
- 特定の要素にアクセスして中身を取り出す
- 特定の属性にアクセスして値を取り出す
「特定の要素にアクセス」「特定の属性にアクセス」するためにCSSを利用することが多いので、スクレイピングをするためには、CSSに関する知識も少々必要となります(目的がスクレイピングということであれば「少々」で十分です)。
CSS
CSSとはCascading Style Sheetの略で、HTMLやXMLの要素の表示の仕方を指定するための言語です。CSSを用いることで、html文書内の特定の部分に対して、色や文字の大きさ、行間、余白等を指定することができます。
以下の例では2つ目のp要素のclass属性に「ex_class」という値(文字列)を付与し、3つ目のp要素ではid属性に「ex_id」という値(文字列)を付与しています。example.cssというcssファイルで、class属性がex_classであるp要素やid属性がex_idであるp要素に対する表示方法(色、文字の大きさ、etc)を指定することで様々な形で表示させることができます(詳細はここでは割愛します)。このclass属性やid属性をスクレイピングで利用することができます。
<html> <head> <title>タイトル2</title> <link rel="stylesheet" href="example.css"> </head> <body> <h1>2ページ目</h1> <p>何もない場合</p> <p class="ex_class">classの例</p> <p id="ex_id">idの例</p> </body> </html>
CSSセレクタによるHTML構造の抽出
前述したとおりスクレイピングは
- 特定の要素にアクセスして中身を取り出す
- 特定の属性にアクセスして値を取り出す
を行うことですので、欲しい情報を取得するために「特定の要素にアクセス」「特定の属性にアクセス」する必要があります。この方法の一つがCSSセレクタを用いる方法です。
基本セレクタ
要素型セレクタ
指定された要素名を持つすべての要素を選択します。
構文: elementname
例: 「p」 はあらゆるp要素を選択します。
クラスセレクタ
指定されたclass属性をもつすべての要素を選択します。
構文: .classvalue
例: 「.index」はclass属性がindexであるすべての要素を選択します。
IDセレクタ
指定されたid属性をもつ要素を選択します(1つのページに同じidを持つ要素は1つしかない)
構文: #idvalue
例: 「#toc」 はid属性がtocである要素を選択します。
結合子
子孫結合子
「 」(空白)結合子は、第1要素の子孫にあたる要素を選択します。
構文:A B
例: 「div span」は<div>要素の中にある<span>要素をすべて選択します。
子結合子
「>」結合子は、第1要素の直接の子にあたる要素を選択します。
構文: A > B
例: 「ul > li」 は<ul>要素の直接の子の<li>をすべて選択します
一般兄弟結合子
「~」結合子は第1要素より後ろにある兄弟レベルの第2要素を選択します。
構文: A ~ B
例: 「h2 ~ p」 は<h2>要素のあとに続く同じ親をもつ<p>要素をすべて選択します。
隣接兄弟結合子
「+」結合子は第1要素のすぐ後ろにある兄弟レベルの第2要素を選択します。
構文: A + B
例: 「h2 + p」は<h2>要素のあとにすぐ続く同じ親をもつ<p>要素を選択します。
XPathによるHTML構造の抽出
XPath(XML Path Language)を使うことでもCSSセレクタと同じことができます。XMLはHTMLのようにタグで文書構造を記述できますが、自分でタグを定義できる点がHTMLと異なります。XMLの特定の箇所にアクセスするための簡単な構文がXPathです。
CSSセレクタでは入れ子の階層を降りていくのに 「>」を使いましたが、XPathはスラッシュ「/」で区切りながら階層を記述します。
/html/body/h1
ドキュメントの一番上の要素(ルート要素)から、すべての要素を含めて目標要素に至るパスは絶対パスと呼ばれます。絶対パスは長くなる場合があるため、単純化して「//」を使用することができます。
XPathの指定の仕方
タグ要素で指定する
構文: …/タグ, //タグ
例: /html/body/h1, //h1
何番目かを指定する
構文: …/タグ[n]
例: //p[2]は2番目のp要素を選択
属性で指定する
構文: …/タグ[@属性=”値”]
例: //p[@id=”ex_id”] idがex_idであるp要素を選択
例: //*[@class=”ex_class”] classがex_classである要素すべてを選択
子孫関係
構文 A//B
例: div//spanは<div>要素の中にある<span>要素をすべて選択します。
子関係
構文 A/B
例: div/spanは<div>要素の中にある<span>要素をすべて選択します。
兄弟関係
構文: A/following-sibing::B, A/preceding-sibing::B
例: div/following::spanでdivタグで指定された要素より後の兄弟span要素
例: div/preceding::spanでdivタグで指定された要素より前の兄弟span要素
スクレイピングができるようになると
こんなことができちゃいます!
スクレイピングに用いるrvestパッケージの使い方を知りたい方はこちら
まとめ
スクレイピングをするにあたって最低限必要なHTMLとCSSの知識を整理しました。HTMLの要素の指定の仕方(CSSセレクタ、XPath)はここに示した以外にも多くの方法がありますが、それは効率的に要素をするための方法です。逆に言うと、「泥臭い方法でもよし」とすれば、ここに示した方法だけでも十分な場合が多いです。それより、スクレイピングのコードを書いて慣れることの方が大切です。ぜひ、スクレイピングに挑戦してみてください。