#author("2019-09-16T10:37:36+09:00","","")
#author("2019-09-16T10:37:53+09:00","","")
#navi(../)

* PowerShellでHTMLのtableタグをスクレイピング・解析する・XmlDocument [#h49e353e]
tableタグで作成された表を解析しcsvなどにしたい場合はありませんか?~
本資料では、単純なHTMLを用意しHTMLファイルのスクレイピングをしてみます。

#htmlinsert(win-top.html)
#contents

* 使用したWindowsとPowerShell [#oe2a378c]
-Windows
#ref(ver.png)
#br
-PowerShell
 PS C:\> $PSVersionTable.PSVersion
 
 Major  Minor  Build  Revision
 -----  -----  -----  --------
 5      1      18362  145

* 関連記事 [#h2312120]
curlやwgetのようにURLを指定して情報を取得する場合は、以下の記事を参考にしてください。
-[[PowerShellでwgetやcurlのようにウェブページを取得する>PowerShell/wgetやcurlのようにウェブページを取得する]]~
JSON形式の場合は以下の記事を参考にしてください。
-[[PowerShellでハッシュからJSON,JSONからPSCustomObjectに変換する方法>PowerShell/ハッシュからJSON,JSONからPSCustomObjectに変換する方法]]~
JSON形式については、仮想通貨取引所が公開しているパブリックAPIに対しPowerShellで情報を取得するサンプルも公開しています。~
-[[仮想通貨(暗号通貨)メモ>https://cryptocurrency.just4fun.biz/]]

* [xml]を使用してtableタグ内の情報をスクレイピングする [#ma2d9342]
以下のHTMLファイルを用意しました。
#ref(10.png)
''sample.html''&ref(sample.zip);
''sample.html'' &ref(sample.zip);
 <html>
     <head>
         <title>sample</title>
     </head>
     <body>
         sample table
         <table>
             <tr>
                 <th>No</th><th>value1</th><th>value2</th>
             </tr>
             <tr>
                 <td>1</td><td>11</td><td>12</td>
             </tr>
             <tr>
                 <td>2</td><td>21</td><td>22</td>
             </tr>
             <tr>
                 <td>3</td><td>31</td><td>32</td>
             </tr>
         </table>
     </body>
 </html>

htmlファイルをSystem.Xml.XmlDocumentオブジェクトとして読み込むためには、以下の構文になります。
 $obj = [xml](Get-Content ファイル名)
上記の通り、htmlファイルをXmlDocumentオブジェクトに読み込み操作することになります。


* HTMLファイルをXmlDocumentオブジェクトに読み込み操作する [#m76829e8]
以下は、用意したsample.htmlをDドライブ直下に置いてPowerShellにて操作した実行例となります。
+ htmlファイルを読み込みます。
 PS D:\> $obj = [xml](Get-Content D:\sample.html)
 #br
+ 読み込んだ情報($objに格納)を表示するとhtmlタグがあることが確認できます。
 PS D:\> $obj                                                                                                            
 html
 ----
 html
 #br
+ htmlタグを指定し表示しています。headとbodyがあることが確認できます。
 PS D:\> $obj.html                                                                                                       
 head body
 ---- ----
 head body
 #br
+ bodyタグを指定すると、テキストとtableタグがあることが確認できます。
 PS D:\> $obj.html.body                                                                                                  
 #text                          table
 -----                          -----
 ...                            table
#br
+ textの内容を取ってみます。~
HTML内のテキストを取得することができました。
 PS D:\> $obj.html.body.'#text'                                                                                          
         sample table
#br
+ tableタグを指定すると、trが4つ存在しているのが確認できます。
 PS D:\> $obj.html.body.table                                                                                            
 tr
 --
 {tr, tr, tr, tr}
 
 PS D:\> $obj.html.body.table.tr.count
 4
#br
+ 実際にtr分ループしtr内の要素を表示してみます。~
以下のスクリプトをコピー&ペーストしEnterキーを押して実行してみてください。
 $table = $obj.html.body.table
 $tr_count = $table.tr.Count
 for ($i=0; $i -lt $tr_count; $i++) {
   if ($i -eq 0) { $table.tr[$i].th } else { $table.tr[$i].td }
 }
#ref(11.png)
#br
+ csv文字列としてとして出力してみます。
 $table = $obj.html.body.table
 $tr_count = $table.tr.Count
 for ($i=0; $i -lt $tr_count; $i++) {
   if ($i -eq 0) { $t = $table.tr[$i].th } else { $t = $table.tr[$i].td }
   $t[0] + "," + $t[1] + "," + $t[2]
 }
#ref(12.png)

以上、XmlDocumentオブジェクトを使って、HTMLをスクレイピングするサンプルでした。

#htmlinsert(win-btm.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS