他サイトからc#正規表現で必要な情報を抜き出す

特定のサイトから必要な情報だけ抜き出すことを「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系のものしか見つけられない。

 

 

前回まとめたときの記事を見返しても

「何が書いてるのか全然わからねぇ!!」ってなったけど

今回も記事にしてまとめてみたものを読み返しても

「何が書いてるのか全然わからねぇ!!」って感じ。(今は分かるけど)

 

とりあえず、つぎ正規表現で何かを取得する機会があったとき
未来の自分が今(過去)の自分に感謝する記事になったハズ!

 

以上、解散!

関連記事




コメントを残す

※コメントは承認後に表示されます。
 コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。