特定のサイトから必要な情報だけ抜き出すことを「WEBスクレイピング」と言うらしい。
前回「UnityでHTMLからテキスト出力」の記事でc#による正規表現で特定の1タグ内の情報を取得する方法はまとめた。
今回は複数行にまたがった情報を取得したかったけど
理解して必要情報を取得するのに6時間かかったので忘れないようにまとめる。
◆今回やりたいこと
例として以下の情報を取得したいとする。
①<h2>タグで囲われた複数行のソースコードを取得
②その中の特定の<div>タグ内のテキストと<a>タグ内のリンク先を抽出
つまり
h2タグのIDを取得したい
h2タグ内のdivタグでClassがTitleのテキスト情報を取得したい
h2タグ内のaタグのリンクを取得したい
◆手順
①正規表現をまとめてくれているサイトを開く!
https://dobon.net/vb/dotnet/string/regex.html
②そのサイトの「正規表現テストツール」をDL
③取得予定のサイトのソースを張り付ける
④正規表現を書く
<h2+[\s\S]id=*[""'](?<idGRP>[^""']*)[""']>*\s*<div\sclass*[^\s\S]*=*[""']Title[""']*>(?<divTextGRP>[^""']*)*</div>*\s*<a*\starget=[""']_blank[""']*\shref=[""']*(?<urlGRP>[^""']*)*[""']*>リンク*</a>*\s*</h2>
使い方(途中まで)
⑤正しく抽出が行われると以下のようになる
Matches[0]:抽出結果
Groups[0]:一致した文
Captures[0]:一致した文
Groups[1]:<h2>タグのID
Captures[0]:<h2>タグのID
Groups[2]:<h2>タグ内のClassがTitleの<div>タグ内のテキスト
Captures[0]:<h2>タグ内のClassがTitleの<div>タグ内のテキスト
Groups[3]:<h2>タグ内の<a>タグのリンク
Captures[0]:<h2>タグ内の<a>タグのリンク
解説?
例えば<h2>タグ内に<a>タグが5つあると以下のような表示になる
Groups[3]:
Captures[0]:http://xxxtest.com/aaa.html
Captures[1]:http://xxxtest.com/bbb.html
Captures[2]:http://xxxtest.com/ccc.html
Captures[3]:http://xxxtest.com/ddd.html
Captures[4]:http://xxxtest.com/eee.html
◆今回の正規表現についての解説(というか自分用メモ)
取得したい箇所をグループ化してHTMLソースを完成させるイメージ
<h2+[\s\S]id=*[“”‘](?<idGRP>[^””‘]*)[“”‘]>*\s*<div\sclass*[^\s\S]*=*[“”‘]Title[“”‘]*>(?<divTextGRP>[^””‘]*)*</div>*\s*<a*\starget=[“”‘]_blank[“”‘]*\shref=[“”‘]*(?<urlGRP>[^””‘]*)*[“”‘]*>リンク*</a>*\s*</h2>
緑文字:タグ
青文字:空白または改行
紫文字:グループ化
ワードパットで色付けしながらやっていくと分かりやすい
RegeTextソフト、良く落ちるので検索パターンが出来たらこまめに正規表現のテキストを保存しておく!
●空白について
/s 空白や改行(sが小文字)
/S 空白や改行以外(Sが大文字)
[] カッコ内の1文字([abc]なら aもしくはbもしくはc)
これらを組み合わせて
[\s\S] 空白・改行もしくはそれ以外となるので
空白があったりなかったりするものに関しては[\s\S]としておけばいい
例:空白無し「class=”abc”」 空白有り「 class = “abc” 」どちらも取得したい場合
class=[“”‘]abc[“”‘] と書くと取得できないが
class*[^\s\S]*=*[^\s\S]*[“”‘]abc[“”‘] と書く事で取得できる
※今回の例では空白ありなしがごっちゃになっている
●記号について
[“”‘] ダブルコーテーション分かりやすく全角文字で書くと[ ” ” ’ ]
●グループ化について
(?<グループ名>) カッコ内でグループ名を定義する。
検索するだけならグループ名はつけなくても良い、今回はプログラム側で処理するので分かりやすくつけた。
今回の例でいくと
(?<idGRP>[^””‘]*) ”で始まるもの
グループ化のカッコ内の条件が良く分かってない気がする。
◆最後に
これでやりたいことができる・・・!!
自動で正規表現作ってくれるツールないかな・・・php系のものしか見つけられない。
前回まとめたときの記事を見返しても
「何が書いてるのか全然わからねぇ!!」ってなったけど
今回も記事にしてまとめてみたものを読み返しても
「何が書いてるのか全然わからねぇ!!」って感じ。(今は分かるけど)
とりあえず、つぎ正規表現で何かを取得する機会があったとき
未来の自分が今(過去)の自分に感謝する記事になったハズ!
以上、解散!
※コメントは承認後に表示されます。
コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。